00:00
我们现在已经知道scla当中怎么样去使用特征,而且我们也学会了特征混入的方法,那其实我们发现对于一个类而言,它如果继承了父类,而且还混入了特征的话,那其实父类和特征里边所有的属性和方法就都继承过来了,接下来我们在这个类里边就都可以访问到,都可以使用,那如果说当前父类和特征里边出现了相同的属性和方法又怎么办呢?哎,那就相当于起了冲突。这个时候就必须在。当前子类的实现里边去做一个重写了啊,我们在必须做一个这个override,那如果是属性,这个比较简单,直接重写之后使用的肯定就是自己在子类里面定义的属性了,那如果要是方法呢?呃,方法同样也要重写,重写的时候这里还有另外一个问题,就是super super这里边我们调用的时候到底应该是谁呢?可能我们的直觉感觉应该是,那就应该是负类嘛,那又有另外一个问题了,如果说我们没有负类,直接就是多个当前多个特征的话,那么我们直接super调用的又是谁呢?啊,那有同学可能想,那就应该是extend后边的第一个嘛。
01:18
接下来我们就来测试一下,看看当前这个特征如果要叠加在一起的时候,我们这里调它的super到底是怎么样一个调用顺序,所以接下来我们要测的主要就是特征的叠加顺序,我们还是新建一个skyla的object,现在是TEST15,我们把它叫做hit overla,奥测它的叠加,接下来接下来我们还是要定义多个特征了啊啊,那这个特征我们干脆就直接借鉴这边定义好的这个knowledge和talent吧。直接copy过来,然后为了跟前面那个区别,我们直接带上一个编号,这个叫做KNOWLEDGE15和TALENT15,呃,然后这里边我们最关心的其实是要有相同的方法嘛,所以这里边直接做一个实现。
02:13
呃,当前直接打印一下knowledge increase。然后接下来我们同样可以在。Talent下边也来一个增加,现在不是知识增加,而是天赋增加啊,算听起来好像天赋增加不太可能啊,我们只是做一个测试,我们看看到底后边它的这个叠加顺序啊,掉的到底是谁啊,那接下来我们就定义这个类了,Class student15extend啊,为了让大家看的更清晰,我们还是先把PERSON3继承过来,然后后边with。
03:06
A 15,另外with orange15,接下来我们这里边必须要去override dancing和C,呃,这个可能我们也不需要那么麻烦了啊,直接在这里边把它做一个简单实现就可以了。S,另外这边大家需要注意,如果说我们现在这个直接去运行的话。那它肯定有问题,因为我们现在起了冲突,它混入的两个特征都有increase方法,那我们就必须要去做一个啊,这里边必须要去做一个实现,这里边有一个问题,就是我这儿直接去调一个super.increase那到底调的是谁的呢?哎,首先这里有这样一个问题,那我们在上边把测试的代码也是写出来译student new,一个student的值五,然后接下来我们直接找student的increase方法来,我们直接来看一下到底是怎么一回事。
04:18
好,接下来我们运行。大家可以看到这里边直接输出的是knowledge increase,也就是说按按我们的想法,有可能是就是前面谁在前面就应该输出谁,对吧?哎,我们感觉应该是输出这个talent increase才对,但这里边其实输出的是knowledge increase,所以看起来它是从后往前做这样的一个叠加的。啊,所以这个大家一定要注意一下啊,这里边的特征,它这里边直接调S的时候,它返回调用的其实是最后一个特征对应的这个increase啊,那另外大家可能就想到了,那假如说当然本身这个person里边不应该有increase这样一个方法啊,那假如说我们在person里边也有increase方法,那又那又会怎么样呢?我们把increase也也写过来啊,假如说真的是这个person increase啊。
05:19
大家想一下。目前。难道说我们调用的是呃,是这个当前负类的increase呢?还是说我们调用的直接还是这个knowledge呢?大家看到运行之后的结果还是knowledge increase啊,所以大家看到这里边我们的这个多实现,它本质上其实就把它当成了多继承一样。这里边的自己的父类和其他的混入的特征其实是平等的。它的叠加顺序是什么呢?就是从最后开始往前一个一个叠加啊,所以接下来直接你做这个super调用的时候,它并不考虑当前自己有没有负累,他直接就是把最后一个特征,我们当前这个继承顺序里边的最后一个拿来做了一个调用。
06:07
这是大家需要注意的一点啊,当然了,一般情况我们如果要是解决冲突的这个特征,这个方法可能跟它的负类是没有关系的啊,负类里边可能一般不会有这样的实现,就是大家也要稍微的做一个注意。
我来说两句