00:00
我们已经知道SC当中的特征或者叫特质应该怎么用了,那接下来呢,我们再把它比较复杂的用法一一做一个讲解,首先就是前面我们说了。Scale当中是单继承多实现,所以当前的这个特征呢可以有多个,哎,这就是我们所谓的特征可以混入,那接下来我们就来测试一下特征的混入,为了让大家看的更加清晰,我们新建一个测试文件,还是用一个SKY的object分离对象,现在是14,我们重点测的是K的C混入,叫做mix c。啊,那这里我们一方面是借鉴前面定义好的,呃,这里边有这个副类,另外还还有对应的这个一个样一个特质啊,那这里边我们干脆就再定义,单独定义另外一个特征。定义一个复制it,那我们想想,对于这个学生而言,他应该还有哪些特质呢?啊,那学生我们不同的学习嘛,那应该是还可以获取知识,所以应该是呃,比较有知识的这样一个特征啊,我们听一个特征叫做knowledge。
01:22
Knowledge里边又有哪些属性和方法呢?啊,这个就按大家提的一些想法啊,比方说这里边我们可以定义一个knowledge的属性叫amount,大家想到知识可能总量有一个数值,那关于这个数值是多少,就按照我们自己的定义来看啊,它可能是一个T类型,初始值是零,然后接下来呢,我们可以定义一个是增长方法啊,比方说我们把这个叫做increase increase,这也不需要返回任何的呃东西啊,我们先要不你先定义在这儿,比方说当前这个就是一个抽象的方法,我们要用到的时候再去做一个,呃,做一个实现就可以了。
02:08
好,那然后接下来我们可以定义一个类了啊,因为当前这个类要混入多个特征,显然跟之前的这个呃,STUDENT13就不太一样了啊,那当然其他的一些方法我们也可以直接copy过来啊,其实是差不多的,那干脆就直接把这个复制过来吧。然后这里我们把这个叫做student 14,同样其实还是继承了13,然后with young,那另外呢,我们可以再继续混入一个特征,那就直接with knowledge,现在就相当于我们已经有了两个特征,还有一个。代表它本质的负累。那这里当然就看到,呃,这个是报错了啊,因为我们还有抽象的方法没有实现,那接下来我们关键就是要实现一个对应的抽象方法了,现在我们里边已经有了dating study,还有这个c hello3个方法,那接下来我们实现的是的一个方法,直线。
03:16
特制中的抽象方法。那接下来我们在这个里边,呃,我们就想一下这个increase应该怎么做啊,比方说啊啊,每一次这个调用increase方法的时候呢,我就让当前的amount,呃大家知道当前既然我已经继承了。有knowledge这个特质,那当前这个STUDENT14里边其实也是有amount这个属性的,所以接下来我就让AMOUNT8等于1A1,然后接下来我可以做一个打印,我们说student还一个name,然后谁的。
04:09
Christ啊,然后我们把当前的这个amount做一个输出啊,这这就是我们一好的一个基本的方法调用,有了这个基本定义之后,接下来我们就可以在上边做一个测试了,同样还是定义一个student,你有个STUDENT14,然后接下来各种方法调用,比方说student可以先study啊,那通过这个学习之后,当然可以知识做一个增长,我们直接调它的increase方法,然后接下来啊,学习完了去放松一下,玩一下,当然了,玩的过程当中也是增长知识的过程啊,所以继续increase后,我们还可以做一个dating约会,好,当然了,约会完了之后知识也会增长,一贯的知识也增长了,你接下来我们就看一看。
05:09
执行得到的结果是什么样?大家看到这个完全没有问题,就是每一次调用我们这里都会有一个amount加一都会知识量,知识总量要上升嘛,所以前面我们看到是student在study,然后INCREASE1,接下来是playing,接下来呃是increase之后知识量是二,最后dating知识量是三啊当然前面这个playing的话,因为我们调的是样那个特征里边已经实现好的方法,这里只是传入了一个当前他的name student啊,别的呢,都是在样那个方法里边已经实现好的,这就是当前对于这个特征混入之后的效果。那关于这个特征的混入呢,还有另外一种比较特别的用法,就是我们不光是可以直接在定义。
06:02
声明了具体的这个类的时候,我们把它这个特征啊,直接混入进来,With young,然后with knowledge啊,然后把对应的这个抽象方法做一个实现,接下来就可以用了,创建它的实例,去调用它的方法,那大家会想到当前的这个特征啊。他某些情况下是很像抽象类的嘛,之前我们对于抽象类而言,其实是说过我也可以。不直接创建一个新的子类去继承它,呃,把里边的内容做实现,然后再去创建它的对象,其实可以直接创建它的匿名子类,那那所以像现在的这个特征能不能有同样的用法呢?就比方说我根本就不创建当前的呃,一个具体的student这样一个类啊,哎,那我这里边有可能就是直接上来之后就。把当前的这个某某一个。某一个类型啊,直接就混入一个新的一个特征,能不能直接做到这样一一个特点呢?呃,只要是混入了特征之后,我把里边具体的那个抽象方法做了一个实现不就完了吗?就可以创建它的新的这个实例对象实例了吗?所以接下来我们就看一看在scla当中怎么样做这样的混入,类似于之前欧象类里边的那种域名子类的实现,我们看一下,呃,这种方式呢?
07:28
就是所谓的动态混入,我们在上边还是解一个分割线。也就是说,当前我们定义的这个特征,它不是直接不在某一个类里边已经混入进去。它的属性和方法都已经在里边的,而是我们在使用的时候才单独的把这个类里边再去额外添加某一个特质,这个就这种方式就叫做动态混入啊,那接下来我们就看一下前提就是说我们还得再去定义特质了啊,比方说我们再定义一个treat。
08:09
呃,我们再想想当前的学生除了轻样和有知识knowledge之外,他还有什么呢?啊,我们想想啊,可能还有这个天赋技能,到说我们再定义一个talent,那么这天赋技能呢,那就那我们随便去定义了啊,比方说有这个singing啊,就是会唱歌是一个是一个抽象的方法,直接放在这儿啊,当然了也可能有这个会跳舞两个抽象的方法别放在这儿,那现在大家会发现啊,目前STUDENTT14,除非我们直接就在后边with这个,呃,Talent直接就把这个都定义在这儿,那大家可能会想到,那所有的这个学生也未必就都有天赋啊,那所以怎么样呢?那我就是在用到要创建一个有天赋的学生实力的时候,我再去把对应的这个特质混入进去。
09:09
我们看看到底怎么样,这样动态混入,那就在这里啊,要丁去创建一个student,当然这个student我们就叫有天赋的学生student with,这样还是new一个STUDENT14,接下来我们直接这么写with,所以大家看就是相当于是。我们在创建这个对象实例的时候,才去实现对应的特质里边的那些具体,呃,我们定义声明出来的抽象属性和抽象方法啊,那这样的话,创建出来的实例就有了对应的这些方法了。接下来大家看一下啊,这里报错就是因为我们没有把它实现嘛,Be overrides里边我们可以直接呃打印一句,我们说这个学生啊,Student is good at。
10:13
那同样我们可以把singing也做一个实现。Is good at,哎,实现之后这里就不报错了,接下来我们的这个student啊。它除了上边我们可以调的这些方法之外啊,我们在这里啊,At可以看到,可以say hello,然后student with,也可以去play,也可以study,可以像上面这样去dating,当然了还可以去anything和sing啊,所以所有的这些方法它其实都可以去使用,这就是我们所谓的动态混入的这个过程啊,我们来运行一下。
11:07
看看执行的结果是否正确。大家看到完全没有问题啊,所有的方法都能够直接调用。这在有时候代码里边还是非常方便的一种使用啊,这就是关于特征的混入。
我来说两句