00:00
呃,接下来呢,咱们讲一个在这个笔记里边没有的东西啊,叫做多肽啊。首先呢,我在这个里边。新建一个文件零三。杠多台点TS。命点GS当中呢,我会把这个文件引用进来。点杠啊,多肽好搞定啊。呃,在这里边我们要讲这个多肽啊,首先有句话啊,叫做什么呢?负类型的引用。指向。指向。和子类型的对象,然后呢,还有一句话叫什么呢。呃,不同类型的对象,针对相同的这个方法。产生了。不同的这个行为啊,这两句话怎么去理解呢?咱们先放在这儿,咱们先写一段代码来看一看啊。
01:07
呃,在这里边首先呢,我们先定义一个父类,然后呢再定义一个子类,之后呢,再定义一个子类。呃,复利当中呢,我们写个class。Animal。然后呢,我们就写上一个属性吧。4G。这是一个属性啊。然后呢,我们再去定义一个构造函数constructor括号。里边我就写上一个name啊。然后呢,在这块this.name等于name,这是属于更新属性值啊,或者说叫做初始化也都行啊,下边我再来一个实例方法,这个方法比如说我们就叫做run。
02:07
然后呢,里边Dis distance distance给他来一个什么呢?数字类型。点log括号啊。跑了什么呢,这个是这么写啊。嗯,括号。跑了,诶跑了什么呢?括号。然后是。Distance。这么远的距离,默认呢,我给它一个值,比如是零啊。好,然后呢,我做一件什么事情呢?来一个子类去实现啊,去继承我当前的animal这个父类啊。Class,比如说来一个dog animal。小括号里边呢,也有一个自己的构造函数。
03:04
Constructor括号里边呢,我也给他写上一个name啊。然后呢,直接使用super的方式把name呢给它传递进去,这个叫调用。父类的什么呢?构造函数,实现子类。嗯,中属性的这个初始化操作啊好,它里边呢,我也给他一个实例方法,但是这个时候呢,他会重写父类中的。实例方法。啊,也是跟上面是一样的啊,我就复制了。好,这个呢,默认我给他来一个五米啊。好,然后呢,下边呢,我再定一个子类,和上边这个子类几乎是一样的,只不过这个地方呢,我给他来一个叫什么叫做pig吧。
04:02
小猪。嗯,这个代码不用就改不用改了,这块呢,默认给他来一个十啊OK,现在他们之间呢,都是继承的关系是吧,那一个父类两个子类。然后呢,下一步我要做的事情是什么呢?是实例化复利对象。啊,Cost in吧,冒号它应该是属于animal类型的,等于new animal啊,现在我们这个代码就换的这样写了啊。比如说那我就写个动物吧,是不是?啊,当然这个位置的话稍微改一下啊格式化。保存一下啊。删掉啊,重新在这边开一个终端。嗯,去掉它啊。这个我去掉好正常了啊。然后呢,在这个里边AI点让调一下这个方法。同时呢,这个是实例化子类对象。
05:00
Cost这个来一个dog冒号,然后呢,我写的是一个do newj啊。那这块呢,我管这个狗狗叫大黄。那dog也可以调这个方法,继续实例化子类对象。啊,再来一个pick。等于new pig。啊,那这个小猪我就管它叫做八戒吧,呃,Pig这点RA这个方法啊,我们先来看一下啊,在我们的页面当中能否正常的去显示这些效果,跑了零米这么远的距离,跑了五米这么远距离,跑了十米这么远的距离是吧?啊,另外呢,然后我把它的名字展现出来啊,这个位置的话,我写个this name。复制一份。这样大家可以看得更加明显一些啊。
06:00
这个位置粘贴错了啊。应该是在上边好保存一下啊,我们再来看一下。第一个是动物,第二是大黄,第三个是八戒,对吧?好,那现在也就是说我前边的这个AI的变量类型应该是animal的类型。所以说我可以去new一个animal的对象是吧?那通过上面这个代码的观察呢,我们可以这么想。其实也就是说父类和子类的关系是吧,就是父子关系嘛,那么我们此时可以做件什么事情呢?是使用父类的这个类型,创建这个子类的对象,咱们看一下行不行啊,怎么写呢?这么写cost,比如说我来一个do。冒号写的是animal new的是什么呢?Dog?里边我写上一个小黄。之后呢,我用这个do一点这个run方法,咱们看看行不行,再来一个cost pig冒号,我也写个animal,等于的new是pig。
07:11
里边我写的是。呃,第一个是八戒,那第二个我就写个小猪吧,是吧。然后呢,再来一个P1,然后点。注意啊,我在上边给它来一个华丽的分割线,我们来看一下啊,行还是不行。我们看哎可以也没有问题是吧。结果是有的,编译也是正常的,也没有任何的语法错误,那现在我所写的这个代码和下边的这行代码,我们来看一看啊。DOG1P1。我可不可以认为DOG1的类型是animal呢?没有问题。那PIG1它的这个类型是不是也是animal呢?这是不是就代表着DOG1和PIG1它俩都是属于animal这种负极类型?对吧,但实际上拗的是什么呢?是子类的这个对象,所以上边有句话说什么呢?父类型的引用指向了子类型的这个对象。
08:08
说明没有问题,可以这样做是吧?好,那不同类型的对象,针对相同方法产生的不同行为,比如说。无论是我当前的dog,还是pig,还是DOG1,还是PICK1,它们都可以掉相同的方法run,但是产生出来的结果是不同的,这就是所谓的多肽,那它有什么用呢?是吧?好,这个时候比如说我们在这有一个function,比如说叫做收MSG吧,是吧。啊,收软吧。然后括号括号。里边呢,我这个位置写个AI冒号animal的这个类型,那我在这里边我用什么a ni点这个run方法,咱们看看。有什么问题没有啊,注意是该函数需要的参数是什么呢?是animal类型的。那现在来看的话,我可不可以调用收run的这个方法,把什么呢?把这个dog一传进去。
09:05
我再调一次这个方法,可不可以把当前的P1也给它传进去呢?是吧,好,注意啊,我再来一个华丽的分割线。保存一下。大家刷新啊,我们来看一下说明也有结果。从这个结果来看的话,说明我这么做是没有问题的。那为什么这样写可以呢?因为我的dog和PIG1它俩实际上都是属于animal这个类型的。那animal的这个类型。它的父类当中,或者说这个这个animal父类当中是有RA的这个方法的,只不过因为里边存储的虽然说是animal类型,但实际上都是真正的子类的类型。然后他们去调的run方法是各自的自己的这个run的方法,所以说大家可以看一下,这个是小黄的,这个是小猪的,是没有问题的,这就是所谓的什么呢,多肽啊。
10:00
就是什么呢,不同类型的对象,针对相同的方法产生了什么呢,不同的这个行为啊。注意啊,当然这些不同类型的对象实际上都是有了继承的关系之后的,这个对象都是子类对象啊,子类对象调用的方法都是自己的方法,虽然说他们在定义之初类型是负类。是吧,类型是负类,但是实际上都是调的是自己子类对象里边啊,这个重写之后的方法是没有问题的啊,这是多肽好这块呢,暂且大家稍微的去理解一下啊,然后咱们接着往后去看啊,先把这个停一停。
我来说两句