00:00
对于SC当中特征的混入,我们发现混入之后有可能会出现相同的属性和方法,这个时候就出现了冲突,解决冲突的方式非常简单,直接override重写,但是重写的过程当中呢,有可能我们又要调用S,那这个S到底指代的是谁呢?这就涉及到一个特征的叠加顺序,我们发现了叠加顺序整体上来讲其实是从右到左叠加的。所以如果说我们发现一个类继承了父类,而且还混入了多个特征的话,其实它所调用的S,那是最后一个,最右边的这个特征。啊,那只有在没有混入特征的时候,它所掉的这个super才是自己真正的负类,这个比较特别,大家需要注意一下,然后这个其实还不是最为复杂的场景啊,大家可能会想到,那还有什么场景更加的奇怪呢,更加复杂呢?诶,那就是所谓的菱形继承的关系了,什么样的情况呢?我们可以看一下文档里边的介绍啊,那前面我们指的是比较简单的这种继承关系啊,这种情况我们就是出现冲突,那就重写方法,如果出现super,调用顺序就是从右往左,接下来如果说大家看到出现了这种继承关系,那又怎么办呢?
01:19
啊,我们看到啊,Treat特征它本身也可以有继承啊,就是我们当前在这个代码里边一个treat,后边也可以去extend是没有问题的啊,我们可以认为它就像那个抽象类一样吧,所以同样可以定义它一成子哪一个负特征,那这里边有一个问题,就是说目前子类可能混入了两个特征,Tra a和tra b,而这两个特征呢?又分别都继承自tra c,它们构成了一个菱形继承关系,那这个时候肯定如果里边的这个方法出现冲突的话,那子类里边肯定是要重写了,但重写里边如果出现了super的话,那到底又应该是谁呢?
02:03
按照之前我们想的,那要看声明时候定义的顺序了,如果我们这里边是extend treat a,然后with treat b,那从右往左结合嘛,它的super应该是treat b,这个很很好理解。那现在又有进一步的问题,如果treat b的方法实现里边也调用了super的话,那它的super又是谁呢?那这个听起来好像不是一个问题啊,那他的super肯定就是trade c了吗?是这样吗?那这就需要我们打一个问号了,接下来我们可以在代码里边做一个具体的测试,看一看这样一个所谓的钻石问题到底应该怎么解决。啊,那为了解决这个问题,我们还是用一个新的案例吧,因为当前这个案例大家可能想象不到这两个treat它能继承自哪一个共同的特征啊啊,那所以接下来我们另外定义一个。
03:01
第一个。Treat呢,我们把它定义成球类,我们接下来要考察的就是要创建一个一个球,也要定义某一个球这样一个类型,然后呢,呃,我们要继承的属性,继承的特征,那就是首先是报有球类这样一个特征,定义球类,那么对于这一个球类里边我们就只定义面测试啊,只定义一个方法叫做描述describe,为了方便后面做叠加,我们直接就把它的回执定义成string,非常简单,直接就是它是一个球,然后接下来呢。我们定义它的一些子特征,就是轴,一个球它还可以有哪些进一步的特征呢?比方说我们可以定义它可以有不同的颜色,它可以有不同的种类啊,比方说篮球,足球啊,这个我们都可以去单独去做一个定义。所以接下来。
04:09
我们定义颜色正,那所以接下来我们定义的这个其实是一个color,它当然就应该是extend,前面的ball大家其实可以想象得到啊呃,当前应该是它有一个属性叫做color,我们这个就干脆直接写死吧,需要去override一个describe方法,那在这里面呢,我直接去super describe这个调用。得到的其实就是一个Bo,那我现在如果要描述这个带颜色的球,应该怎么描述呢?那其实就是加上自己的颜色不就完了吗?啊,比方说我们在这里可以直接定义一个。Color street,然后说当前我们的这个球是一个red红色的球,默认是红色的啊啊,那所以这里我就可以直接把。
05:13
当前的color,然后再搭上z describe,大家就知道当前的描述就变成了一个red ball啊,为了让大家看得更清晰一些,我这里可以。可以把后边加上一个连字符,后边打印出来的话就会更加的清楚啊,那同样对应的还可以定义种类种,当前的这个种类,比方说啊,我们这个叫做cat GR,这就extend,同样还是extend ball,当前的种类跟它的颜色当然是没什么关系了啊,B只是跟当前是球球类这是有关系的啊。那比方说我们当前的这个种类还是定义一个属性I degree,那这应该是一个string类体,比方说默认的是一个足球啊,那就是foot football对吧?啊,或者我们这个种类在想,如果要是直接把这个下划线加在后边也是可以的啊,后面写会简单一点,我们这个就还是这样写吧,Override,把它写在这儿。
06:27
后边这里就是e grades加上一个连字符,然后加上super点,我们这里如果直接输出的话,那就是football,对吧,当前的这个描述就是football,好,现在问题就是要定义这样的一个定义,一个自定义求。啊类,所以当前是一个class啊,相当于我们最终的那个子类了,我们要自定义的是我自己的一个足球,所以我把它定义成my football,呃,自然我们想到它的定的这个特征,我这里边不需要再去继承ball,因为我直接继承color ball和football不就完了吗?啊,当然,呃,就是category就可以了吗?所以接下来。
07:20
我们extend啊,当前首先我可能想到,我最想要放在前面的应该是它更为本质的那些特征,对吧?当前最为本质的当然是种类了,Category ball,然后with hard ball。里边同样我要override当前的describe方法,哎,那这里就涉及到另外一个问题啊,就是当前如果说我想要调这个super.describe的话,那是谁呢?诶,这个大家知道,这里边其实得到的应该就是。应该调的是color ball对吧?啊,那color ball大家看到按照我们的定义啊,它又继承自ball,那这里边。
08:07
这里边应该就是输出的应该是一个red ball对吧?那所以这里边我在这前面可以加上一句话,My is是一个什么样的球,做一个呃描述啊,做一个打印输出,那接下来我们看一下这样一个,这就是我们所说的钻石问题了啊。钻石问题特征叠加,所以我们定义一个my football。又一个my football,然后接下来直接,哦哦,当然得到的是一个string类型啊,所以我们printline一下my football and describe,我们可以猜测一下得到的到底是什么。
09:02
直接做一个运行。大家看到直接得到的是my ball ISA red football,不是我们想象的当前他继承的super是color,然后呃,后面直接加上color的super,然后直接得到这个ball,直接就是红色的球,并不是这样一个结合,它连它的种类football也直接就输出了,为什么我们可以得到这样一个结果呢?哎,这就必须要给大家再说一下我们对于这样一个菱形继承啊钻石问题的结合顺序了,大家可以看一下我们文档当中的这个图解,这里边在做这个特征叠加的时候,它的继承关系其实是什么样的呢?大家需要注意一下,就是首先我们考虑到写出来啊,比方说my ball,然后继承了category ball和with color ball,然后接下来我们首先按照从右到左的顺序,那其实本身应该my board super是color ball,然后接下来才考虑别的,哎,那整体来讲他们俩又继承自Bo,那到底应该。
10:10
它们之间啊,整体来讲的这一个依次叠加的顺序到底是什么样的呢?看起来他们都有关系。这里大家要注意一下叠加顺序是,首先我先要判断最上层的这种继承关系。首先我们看到了当前的category,这,这不是要extend category吗?Category。Category ball,它继承了ball,那么我们先把这样的一个继承关系写出来,然后呢,下面又with color ball color ball也继承自ball,那么同样把它写出来,这里大家要注意,如果列出了两个继承关系,发现有了共同的元素的话,共同的特征的话,那这个时候我们不应该重复,对吧?呃,要把它们直接叠加在一起,怎么叠加呢?那就是把后出现的这个color,大家要注意它是直接。
11:02
追加到我们之前出现过的这个category ball和ball的之前的,所以大家看到是这样的一个叠加顺序,首先是ball和category ball它们之间的这个继承顺序,然后出现color ball的时候呢,发现它也是ball的一个子特征,它就直接把它给。连接是直接连接到category报上,然后最后再来说把自己的这个子类同样也叠加在前面,所以大家看是这样叠加上来的,这就是为什么之前我们说如果要是只有两个特征的话,他们如果没什么关系的话,那么叠加顺序就是从右往左啊,因为就是按照这个顺序先放到最右边,然后再依次往左边去挂新的,呃,接下来这个继承次的那个关系的。所以就是子类都是放在最左边,那最底层,或者说我们继承的这个最根源的啊,这个祖父类,那其实是放在了最右边,所以最终我们的叠加顺序就应该是。
12:07
自己定义出来的my ball,那是继承字,按照这个继承关系啊,应该是color ball,然后color ball,如果再调super,掉的是谁呢?注意,不是直接掉ball,而是category ball。然后category ball再调super,调的是ball,所以大家看到我们目前的这个代码执行的顺序就变成了我们要执行的是my ball.describe my football.describe那么这里边我们这里边my ball ISA super super掉的是谁呢?是这里的。大家看到按照这个叠加顺序啊,从右往左,所以先是color ball掉的是它,然后color ball这里呢,Red我们已经知道了,然后red后边还要再跟着他的super.describe哎,那他的super是谁呢?是category,按照叠加顺序。
13:02
那么category报这里的category是?后边还要再跟着他的super,然后才是我们最终的这个,那最后输出的就是red football啊,所以这个跟我们的直觉也是相同的,为什么呢?啊,因为越往后这就应该是越本质的东西吧,我们要想输出的时候,这个叠加顺序不就是这样吗?对吧?越本质的东西我们放在越后边,所以按照我们之前叠加呢。看到就是这样啊,先把最本质的到最右边,然后呢,不太作为本质的那些特征,我们依次往后面去叠加,往左边去叠加,最前面的是我们当前自己定义的这个子类。这就是钻石问题的叠加顺序,这个比较特殊,大家需要下来之后好好的测试一下。
我来说两句