00:01
好,我们接着往下来说啊,接下来呢,我们来说的这个点叫做继承,继承也是一个诶,面向对象当中很重要的一个点啊,它是我们这个面向对象的一个,诶很重要的一个特点,有了继承以后的话,其实对我们的面向对象的话,有一个非常大的一个简化。而继承这个东西,在我们这个编程这个领域的话,它出现的几率还挺高的,像我们在写这个CSS的时候,就经常说到这种样式的继承啊,给这个祖先元素设置的样式子元素上是不是也会同时有啊,哎,那我们这个类的继承什么样子呢?其实啊,大同小异啊,大同小异,那这块我们演示一下,为了把这个演示一下,因为我们这个TS呀,它会检查我们这个不同文件当中这个变量的名的一个重复,那就导致我们这个诶在零三里边,我们就不能再起0201里边那个名字了,所以为了解决这问题啊,因为我这个起名啊。你让我起好多名,我还挺别扭是吧,咱们也不好记,那咱们干脆干嘛呢?我在这儿写一个立即执行函数,那一会儿的话,我把我的这些所有代码呢,写到这个立即执行函数里,那这样实际上就等于我的所有的这些变量我就创造了,创建到了一个这个单独的作用域当中,这样就避免我们这个名字再发生什么冲突了啊那这样的话,比如说我现在再创建这个class,我叫person啊person,那这个时候的话,它就没有冲突了,因为这个作用域不一样了啊好,那现在的话我们来演示一下,那我现在呢,还想回到我们之前这话题,我想定义类啊,我来定义一个什么呢?诶表示狗的类啊,表示狗的类,那这就简单了,对吧?Class,哎,我们来一个DOGDOG呢,哎,Dog我们这儿来一个这这这个这个name啊,Name类型是string,来一个age,类型是一个number,再来一个constructor,写一个它的构造函数,直接来一个name。
01:57
然后来一个age,我们来一个number,那这里边我们直接来一个z name等于name,然后这来一个z.H等于H,都给它进行一个赋值啊赋值然后呢,我们再给这狗这个类呢,添加一个方法,狗的话,比如说我加一个c hello啊c hello c hello c hello的话,我们就简单一点,狗嘛,狗呢才不会说别的对吧,狗呢只会说旺汪旺旺旺啊汪旺旺哎大概是这么一个意思,然后再往下,再往下呢,我们再定义一个表示model类,那狗的这个类啊,我们可以先试一下啊,我们来一个comes的,我们来一个dog,等于一个拗一个dog,我们创建一个狗,狗的名字呢叫旺财,年龄呢是五岁啊五岁的旺财,然后呢,我们调一下旺财的这个dog,我们先打印一下旺财,然后再调用一下旺财的一个c hello是吧,让旺财这个c hello去执行一下,然后为了它生效,我们得修改一下我们。
02:57
点二我们要改成什么呢?改成零三叫做继承点GS啊继承点GS,然后我们来刷新一下浏览器,让它执行一下,这来刷新走一个。
03:09
诶,你看旺财年龄是五岁,然后汪汪汪,这是不是就出来了啊,就出来了,就这样一个效果,那好接下来我们接着往下看,那我这光有一个狗啊,我这不过瘾了,我还想定义一个表示猫的类啊,表示猫的类class,我们叫一个cat cat干嘛呢?诶,Name类型是string age类型是一个哎,Number,然后再往下写,它也是有一个constructor,有一个什么呢?哎,构造函数name等于name age等于age,也有一个c hello,但是啊,这猫c hello,猫就不能汪汪汪了,对吧?猫汪汪的属于说外语了啊猫得干嘛呢?猫得是喵喵喵啊喵喵啊是吧,我们一起学猫叫一起喵喵喵喵喵啊大概这么一个意思,写完了,那我们这儿也可以再创建一个猫的对象,那我们这儿呢,就来一个cost的一个cat,我们叫做一个cat cat的名字叫咪咪啊,叫咪咪,咪咪呢,诶咪咪三岁了啊,三岁了。同样我这也。
04:09
打印一下这个咪咪,点一个log,然后来一个cat,点一个c hello,点一个c hello,然后这一保存,我们一刷新走一个,诶你看cat是不是就是喵喵喵啊,哎,喵喵喵,那这个时候我们就说到这个事儿了,什么事儿呢?就是我们现在的话,我们定义的两个类,一个是dog的,表示狗的,可以用来创建狗这个对象的,还有一个是cat表示猫的,可以用来创建猫这个对象的,诶但是我在创建的过程当中,你有没有发现什么问题,你会发现啊,我的这个dog这个类,还有cat这个类,它们两个里边的结构基本上是一模一样的,内幕属性age属性构造器是吧,构造函数内A这赋值,然后呢,有一个c hello这个方法唯一不同的是狗的这个私下漏汪汪汪的,而我们这个猫的私下漏是喵喵喵的,就这点不同,其他的地方是不是?
05:09
全都是一模一样的,诶,一模一样的,但是这个时候我们这个类的话,这些代码我们却写了两遍,每个类里面写了一遍,如果我还想创建一个表示蛇的类,我还想创建一个表示猴子的类,我还想创建一个表示恐龙的类,那这个时候我们可想而知,内幕age这些东西是不是还是一模一样的呀,但是我们在创建这些类的时候,我们却要不得不去反复的去重复的去写这些东西,是不是会感觉有一点点呢?麻烦呢,诶那我们怎么去解决这问题呢?出现重复代码了,又出现大量的CTRLCCTRLV这种操作了,怎么去这问题,其实要解决这些问题的很简单,那就是把这些代码给它提取出来,你不是重复的吗?诶我把重复的代码提取出来,放到一个公共的区域上,放到一个大家都能看到的位置,我们直接共享这一块儿是不是就OK了?诶所以要解决这个问题,我可以怎么办呢?诶我可以在外边我来定义一个这个animal啊,Animal这个类,Animal这个类呢,我们直接来一个class,我们叫做一个animal animal什么意思?Animal叫做动物啊动物,然后呢,诶,我把这一些所有的代码,我直接CTRLCCTRLV我粘到这里边啊,Name edge,然后构造函数,然后c hello,统通的放到animal里边,但是这个时候。
06:45
Animal这个类,那就不能是汪汪汪了,因为你不能所有动物都是汪汪吧,Animal表示的是动物嘛,所以在这儿我要把这个汪汪汪随便改一个,改成什么呢?改成动物在叫啊,动物在叫。
07:01
随便改一个,改完了以后,那这个有什么用啊,你注意啊,如果我这仅仅是这么改的话,那这个时候它对于dog,对于猫啊,Cat这个类就没有任何作用,那怎么能有作用呢?来接下来我把这个dog这个里边的代码删除,把cat这里面代码呢,干嘛呢?诶也删除,全都删掉啊,全都删掉,这个时候这是报错了,你看这是正常的,为什么呢?因为我们是不是没有构造函数了,哎,那就没有这两个属性了,C hello,漏也没有了,是不是也报错了,哎,也报错了,那这里边注意了,那你要干什么呀?老师你说,诶,那注意啊,看着了,我们来看啊,在这儿我可以做这么一个操作,我直接来一个class,叫做一个X ten,谁呢?诶叫做一个animal。Animal,我也可以让这个cat直接来一个extend,叫做animal extend我们叫,哎,可以理解成可以叫扩展啊,在这我们称为叫做继承,所以在这儿我们什么意思,我们叫做使dog类继承这个什么呢?Animal这个类。
08:10
Animal类,诶那下边这个叫什么呢?我们叫使cat类啊,使我们这个cat类,诶继承我们这个animal类啊,这就要继承,其实你就可以直接理解成就是扩展的,这个意思是一样的,那这个继承是什么效果,那注意啊,这个时候我们就要说一下这个基本概念了,你像这儿我这儿写了一个dog extend animal,像我是这么写的,对吧?那此时在这种情况下,我们这个animal animal它被什么呢?被称为父类啊,Animal被称为父类啊,咱们写一下啊,就是这么写的时候,此时我们animal被称为父类,这个道德玛呢,被称为子类。称为子类,也就是我让一个子类去继承这个父类,就像我们生活当中儿子去继承这个父亲的这个财产一样,这么一个叫做一个继承,那这个继承有什么效果?那注意使用继承后,使用继承后我们这个子类将会拥有父类中父类的所有,父类所有的方法和什么呢?和属性,所以说白了,当我这儿写了一个class dog extend animal,实际上就相当于我把animal里边的所有代码CTRCCTRV粘到了do里啊,那这K继承呢,就相当于把animal里面的所有代码CTRLCCTRLV粘到了这个K里,就等于animal有的dog也有了,所以这个时候你再看我这掉new dog new k的时候,他还报不报错了?哎,是不是就不报错了?哎,不报错了,所以这个时候你再。
09:56
看啊,我这一刷新走一个你诶你看效果跟刚才是不是一样了,你看我创建一个旺财,创建了个咪咪,然后是不是动物在叫啊,唯一变呢,就是这儿变成了动物在叫,别的地方是不是都一样啊,哎都一样,所以这个就是我们说的一个继承啊继承,那继承有什么作用?哎,通过继承什么呢?通过继承我们可以将这个多个类中共有的代码写到什么呢?写在一个这个哎负类中,那这样什么呢?诶这样我们只需要什么呢?只需要写一次哎即可让所有的子类都拥有什么呢?诶,都同时拥有。
10:45
哎,负类中的属性和方法。属性和方法,所以这个时候我们说了,当我们这一写以后,就等于我把animal里边代码全都复制到do里,等于do里边把这些东西就都拿过来,都有了,我们就不用重复再去写了,啊,重复再写了,但是这个时候同学可能会有疑问了,什么有什么疑问呢?那老师,那这个时候我们所创建的道,实际上它跟imo是一模一样。
11:17
我们所创建的这个CAD呢,它也和animal一模一样,他们是不是没有任何区别了啊,没有任何区别了,那我如果说。我想。增加一些功能呢。诶,我想在dog里边写一些这个animal里边没有的,可不可以呢?哎,当然可以,当然可以,如果啊,如果希望在这个子类中,哎添加一些什么呢?哎,添加一些我们这个父类中哎没有的这个属性或方法,哎直接加就行啊,直接加就行,我们先以这个方法为例,比如说我想在这个dog里边我们添加一个run方法,那我就可以直接来一个run run的话在这我们直接来一个cancel.log,我写一个啊模板字符串来一个什么呢?来一个。
12:15
诶诶诶,Dollar this.name哎,在什么呢?哎,在跑,谁谁谁在跑,那这个时候等于我是不是在dog里也设置了一个方法呀,所以这个时候表示什么意思?我do不仅仅继承了animal,还在animal基础上增加了一个run方法,所以这个时候如果你想调这个到点,这个re它也是可以掉的啊,这一保存我们刷新一下。啊,那重新加载一下啊,刷新旺财在跑是不是就有了,哎,就已经有了啊,那这个时候你说猫有没有啊,猫没有,因为猫里边我们没有加这个RA法,所以如果你想掉这个k.RA它会报错的啊cat掉一个RA,它这个时候是掉不了的,因为cat里边是不是没有去增加呀,哎,所以这个就是我们继承的一个好处,你不仅可以把这个父类当中的这些东西给它拿过来,而且还可以干嘛,而且还可以增加一些你独有的东西,也就是说你不限于说只有它的一些属性,我可以在它基础上是不是在进行这个属性的一个增加呀,诶增加,那所以基于这个原因继承的话,其实我们用的会非常非常多,像什么时候呢?像有一些情况下,我们在开发当中,我们拿到一个类,这个类我们要用,但是这个类它并不满足,并不完全满足我们的需求,比如说这个类啊,我们需要四个功能,这个类里面干嘛呢?有三个功能,但是。
13:41
有一个功能是这个类里边不具有的,那这时候我们怎么办?那你说老师我直接把这个类给改了不就行了吗?诶注意了,这个类除非是你自己写的,诶你可以改,嗯,但是通常情况下,我们拿到一个类,很多的时候它不是我们自己写的,可能是框架里带的,可能是别人开发我们拿过来直接去用的,你直接去改别人的类好不好呢?能不能改,还说能改,那再说好不好不好,为什么?因为他这个类它是不是有可能在别的地方进行使用了,他别的地方进行使用了,这个时候如果你给他改了,你给他改了。
14:22
那是不是有可能导致他别的地方会出问题啊,诶出问题,所以记住了啊,我们在开发的时候,轻易不要去动别人的类,或者轻易不要去动那些你不熟悉的类,不要去没事儿闲的老去改源码,这样是很危险的啊,风险是很大的,这个东西我们叫什么呢?我们就有一个原则,叫诶叫OCP原则什么呀,O po叫openc,叫closep,就是那个原则的意思啊,叫开辟原则,什么叫开辟原则?就是说我们再去写一个类的时候,我们在编写一段代码的时候,我们要干嘛,我们要对扩展,就是可以扩展,对扩展开放,而对修改呢,关闭要close,也就是我们不能去修改,但是我们可以去扩展,怎么扩展,还是刚才那个问题,我这有一个类,这个类的话我们想用,但是呢,我们需要三个功能,我们需要四个功能,但是这个类里边只有三个功能,那我怎么办?哎,我可以创建一个新类。
15:22
去继承到这个类,哎,去继承这个类,那这个时候我们这三个功能是不是都拿到我的这个心类里了,那你说老师我还差一个功能呢,那这个时候我去修改这个新类,我在新类当中去加这个新功能,那对这个旧类是不是就没有影响了,诶那这个就是我们说的一个这个,哎继承的一个好处,可以在不修改原来类的基础上对这个类进行扩展啊,进行扩展。诶,那这样的话,继承你看像我们刚才我这里边我到个继承animal以后,我是不是就等于给这个animal增加了一个run方法,诶从一应意义上讲,我这里实际上就是对animal进行了一个扩展啊,就这样一个效果,但是还有一个问题,还有一个问题,你看这儿啊,我现在呢,诶animal里边有一个这个。
16:17
有一个这个say hello这个方法,Say hello,当我dog继承animal以后,Dog里边也有say hello,当我这个cat继承animal以后,Cat里边是不是也有hello了?但是问题来了,Hello的话实际上就是叫是吧,狗叫,猫叫,老虎叫等等各种各样的叫,当我整完了以后,他们的hello实际上都是层自animal,所以无论你是dog.hello还是cat.hello它打印的都是动物在叫,动物在叫,也就是说这个方法它能不能满足我们的需求啊?哎,很显然它是不能够满足我们的需求的,跟我们的需求实际上是不是不太不太匹配啊。
17:03
那怎么整啊?我怎么能让他满足我的需求啊?我还是希望什么呢?Dog和K,它里边都有say hello。但是呢,我希望狗的那个四下啊,就是汪汪汪,猫的那个四下漏呢就是喵喵喵,诶那要怎么办?诶注意啊,我们还可以干嘛。我们不仅仅可以添加我们自己的方法,甚至我可以干嘛呢?你父类里面不是有c hello吗?我在子类里面我也添加一个c hello在这儿我直接来一个cancel.log,我们来一个什么呢?来一个喵喵喵喵喵喵喵喵喵,那诶别别别啊,这是狗狗呢,是汪汪汪啊汪汪汪,好写这么一个,那这个时候注意了,这个时候诶。Animal里面有c hello dog继承了animal dog里边也有say hello,那这个东西最终我会用哪个c hello,哎,注意了,如果如果,如果在这个子类中,哎,添加了,添加了和父类相同的方法,相同的方法,哎,则我们这个子类方法会什么呢?会覆盖。
18:18
调什么呢?哎,调负类的方法。诶注意啊,只是在我们子类中,并不是说它会直接把animal里边那方法改变了,只是说什么呢?只是说我们这个dog里边,它这个非hello就变成他自己的了,那我也可以在cat里边,我加一个say hello cat里边say hello呢,诶我这来一个喵喵喵喵喵喵,那这个时候的话,我们会发现什么呢?这个时候你再去调这个哎掉这个C哈勒,那如果是狗的话,如果是dog的话,那就是什么呢?就是汪汪汪,如果是cat的话,就是明明,所以继承的时候,我们不仅仅可以去直接继承,我们是不是还可以修改呀,哎,不满足的,我们就改了,就齐了啊就齐了,所以注意了,这个东西有一个名字,那这个这种。
19:07
哎,这种子类覆盖掉我们这个覆类方法的这个形式,哎覆覆盖掉方法覆盖掉这种子类覆盖掉父类方法的一个,诶这个形式我们什么呢?诶我们称为方法的重写啊重写你看当我这写了以后,你看我这run前面就没有这标志,Run就没有,但是c hello前面是不是就有这标志,为什么?因为告诉你了副类里边也有一个c hello,你这个CR把负类里面那个CR给给重写了,你看箭头向上,你这放上去。哎呀。出字儿啊。啊,它这啊就出来了,你看是不是overre method say hello,诶,In animal重写了父类当中的say hello这个方法,你看你一点你就能链接到那个方法,方法在上边叫做一个重写,所以这也是我们一个小技巧,诶满足我们要求我们就用,不满足要求我们就不用,这就叫做一个继承啊好,这个是我们对继承的一个,诶我们算是一个简单的一个介绍,继承在我们开发中其实用的会挺多的,有了继承以后,其实会大量的减少我们这个代码编写的一个数量,所以这块知识点一定要好好的去理解,当然这儿还没有说完,待会儿我们还要继续往下去说,但是不着急,我们还是先停一下。
我来说两句