00:00
我们已经了解了skyla中面向对象的第一大特性封装,那接下来呢,我们就要来继续介绍另外两大特性,继承和多肽,那这两部分其实大家应该都不陌生,整体来讲,Skyla当中的继承和多肽跟Java也是非常相似的。首先我们来看继承,继承语法和Java应该说是完全一样,我们可以看到class关键字,然后定义一个类,我们当前定义出来的类呢,应该是一个子类,所以跟的是子类的名称,接下来呢,要定义一个继承关系,子类要继承父类,所以接下来是extend关键字,跟着是负类的名称。这就表示当前我们定义的类型是父类的,子类在后边跟着,就是常规定义类的时候,接着划括号里边是类体了啊,那整体来讲以定义了继承关系,那么子类就可以继承父类里边的属性和方法,就可以自己不去做声明,直接拿过来,把父类里边的属性和方法直接拿过来,就作为自己的属性和方法,那跟Java一样,Skyla里边的继承也是单继承,Scda同样是一个单继承多实现的语言,那如果要说跟Java里边有什么不同?
01:20
可能大家需要注意的就是我们之前在封装里面讲过的,构造器如果出现了继承关系的话,那么构造器的调用顺序是先要调取父类的构造器,然后才是调子类的构造器啊,这个其实也非常好理解,既然他们之间的关系是继承关系,父子关系嘛,那当然是应该先有父亲再有儿子了,接下来我们就在代码里边做一个具体的测试。我们还是在406下边去创建一个scla的object,现在是S07,我们现在要主要测试的是承inherit啊,Main方法写出来,首先我们还是既然要测试继承,那肯定是要有父子类的定义了,首先定义一个父类。
02:14
那么为了让我们看得更加的清晰,我们就不直接借用之前定义好的那些类了,我们在这里单独定义我们现在的父子类型,就子类还是定义student,那父类呢,我们就定义成person吧,所以这里边我们单独的定义一下plus person,因为之前已经定义过person类了,我们在这里单独还是要做一个区分,后面就干脆加一个序号吧。接下来我们就是当前这个测试文件是TEST07,那我们这个负类就叫PERSON7,这就非常容易理解啊,比如说后面是空括号,然后加划括号就表示当前person类。PERSON7类的主构造器是无参的啊,所以接下来我们就直接在这个它的类题里边去写它的主构造器里边要。
03:05
定义的声明的这些属性以及对应的一些呃,代码,就是比方说我们可以打印一些信息,我们在这里先定义出对应的属性name string,另外再定义一个age,对于一个person。这些都是非常。直观的具体的一些属性,我们在这儿可以打印一句话,一部类的主构造器,哎哟,这是主构造器这一部分,那大家发现我们只用的这种这种方式呢,是空参的主构造器,然后里边又声明了它的属性,那如果用了这种方法,那。外边如果要传入参数更改这个属性值的话,肯定还是得有另外的一个辅助构造器了,所以接下来我们再专门定义一个辅助构造器,所以我们用这种方法定义,主要是后面让大家要看清楚调用的这个构造器调用的顺序啊,正常来讲的话,我们可能带上参数的那种定义方式会更加的合理一点,那辅助构造器的话,我们都知道必须用this为方法的名称,然后传入name和里边具体的实现必须要。
04:30
要用一下自己的主构造器,然后接下来我们可以打印一行。钱是负类的。五构造器被调用,现在就是副类的辅部构造器被调用,那后面我们不要忘记还要把当前的属性按照传入的参数给它进行赋值。Name和age都进来,这样的话就呃,我们就把当前的辅助构造器也写出来了,呃,接下来为了方便看到一些对应的信息,我们还可以把infer这个方法也单独再定义出来。
05:12
它不需要有任何的返回值,所以是unit类型,里边直接来一句line,那这里边我们就还是用一个字符差值,里边目前是person,然后后边加上好,我们既然是字符差值啊,直接在后面写就可以了,Dollar a,然后在H把两个属性跟在后边,就是我们对于负类的一个定义,那有了父类之后,接下来我们再定义一个子类。目前的子类我们定义bus student,为了跟之前做区分,我们把它叫做STUDENT7,不然现在既然是student,要继承父类,我们这里边后边就加上extend person,然后画括号里边是。
06:10
目前目前这个student类的类题啊,那这里大家需要注意一下,就是我们这里边如果要直接写这个PERSON7的话,相当于在这里是要直接调用副类的主构造器的,所以我们在这里直接写是对的,那是因为主构造器里边本来就没有方法,呃,本来就没有当前构造器的参数,那如果说当前的主构造器里边有参数的话。那其实大家会看到这里调用的时候,我也必须要加上参数,比方说我这里要给一个内,哎,那里大家会看到那里我能单独定义这个name面啊,这个参数从哪来呢?那就相当于子类的主构造器也必须得有参数啊,那所以它就变成了这样的一个定义的过程。
07:01
把前面定义出来,然后后边把内部直接传给。副类的构造器,然后去做处理啊,当然我们现在不这么做,因为后边我们在这儿是单独定义了类name属性的啊,这样的话就乱了,所以我们还是。当前调用的时候就不要传参了,哎,直接这样可以了。我们也知道空参这个空括号可以直接删掉的,所以往往我们就直接写的是extend person7,大家要知道这里其实是调用了副类的主构造器啊,那当然了,子类这里边我们可以给对应的参数,把这个name和age啊,直接就我们说过这个推荐的写法就是直接这里边把这个参数传进来就完了,那至于这里边是不是还需要加上。哇,或者是value这样的关键字去声明出来,这是它的属性呢,不需要,因为这两个属性我只要继承了person,那当然现在就已经有了,只要把这两个参数传进来,然后继继承这个person就可以了,当然了,直接这里继承person的时候呢,我们并没有对于主构造器里边并没有对这个name和A2个属性赋值的过程,所以接下来其实我还需要有一个辅助构造器,对于。
08:17
当前的这两个属性要做一个赋值啊,那所以首先我在外边啊,还是先写一句print前我们就写成三。这个应该是子类的骨构造器被调用,然后接下来我们就可以继续写它的辅助构造器了,DFS里边那里边,但是辅助构造器的话,我们这里除了这两个属性,其实还可以再另外再加一个,比如说我们追加一个一个student number吧,学号。定一个string类型的一开始赋一个空值,然后接下来this里边呢,我可以把对应的这些参数全部传进来,A,另外还有一个s TD number,这样的话,当前student类里边有三个属性,Name和age,两个属性是继承自person来的,而另外还有一个学号student number属性是自己在这里单独声明出来的,定义出来的。好,那接下来我们在这个辅助构造器里边,当然就是先要调用自己的主构造器,主构造方法,第四就要把name和age传入。
09:42
那其实这个大家就看到了啊,这两个参数传入的话,相当于个调用了这个主构造方法,接下来呢,还要调用。主构,呃,副类的主构造方法对吧?所以这就是一层一层我们有有一个调用次序,那到底是先调用哪个呢?就是之前提到的先有父亲后有儿子,所以整个的调用顺序其实应该是先有父类的主构造器调用,然后才是子类的主构造主构造器调用,最后才是子类的辅助构造器调用,是这样的一个顺序,我们可以在这儿再打印一句话,这样的话等一下测试的时候会看的非常的清晰,那就是。
10:26
子类的辅助构造器调用。来了,最后我们不要忘记。还需要有对应的这个赋值。我们需要把s TD number。一道当前的std。this.s number啊,这样的话,我们所有的这个属性就已经付过来了,然后接下来呢,呃,如果说我们直接想继承父类里边的这个贝iner这个方法的话,那当然是。什么都不要定义,对吧?只要是一个student类的对象,那我就可以直接调print iner方法,但假如说我这里边看到打印出来这是person,我现在既然是一个student,我想打印这个student的信息,另外把那个学号也打印进去,那怎么办呢?呃,当然非常简单,就是那就要重写父类的方法,Override,看,直接加一个override关键字去重写当前部类里边。
11:31
In的这个信息,那我们把这个print line复制过来,稍微的做一个更改就可以了,Person改成student,后边除了name和age之外,还可以有一个当前啊,Student SD number,这就是我们当前定义的这样的一个过程。好,那接下来我们可以在上面做一个具体的测试,那方法里边做一个具体的测试,呃,非其实也非常简单,我们就来声明对应的项就可以了,我们先定义一个STUDENT1。
12:04
又一个student,注意这里我们用的是STUDENT7,之前我们定义过很多student类啊,我们就用当前文件里面声明出来的,那student定义的时候呢,我们主构造器是有两个参数,辅助构造器有三个参数,所以这可以,这可以比方说我们给两个参数的话,爱ice是吧,那这个调用的当然就是主到期了,然后另外我们再给一个STUDENT2,又一个STUDENT7。接下来我们给三个参数哦,20,然后再加一个标号啊,比方说我们这个随便给一个号码STD001,那接下来运行一下,我会看到这两个对象定义。就创建的过程当中,我们对于构造器的一个调用,构造方法的一个调用,首先我们可以看到Alice这个student在创建的过程当中,它是怎么样的一个调用顺序呢?
13:10
这里我们定义的时候是调用了子类的主构造器,那么定义要用子类的主构造器之前,必须得先调用副类的主构造器,所以我们看到是一三先调副类的,后调子类的,这里没有涉及到辅助构造器,然后接下来呢,啊,大家看到这里第二个我们创建Bob这个STUDENT2的时候,是传入了三个参数,这个时候呢,相当于我们这里需要。先调用子类的主构造器,才能打印这个子类的辅助构造器,调用这句话,所以呢,肯定之前是先要打印这个三,那么在这之前呢,调子类的主构造器之前还是先要调副类的主构造器,所以我们的打印顺序是134啊,当然这里边没有涉及到负类的辅助构造器,因为负类的辅助构造器我们这里只有在创建person。
14:09
对象的时候,我们才会调用到这里来啊,这是我们整个的这个处理的一个过程。呃,当然就是在这里边我们定义的过程呢,子类的,我定义子类的时候,我们这里extend person,那大家会想到这里就明确的指定了,必须调用的是副类的主构造器,如果说这里边我加上参数可不可以不可以呢?比方说直接把name和AGE2个参数都传入。看,这也是可以的,这样的话,我们当前调用的就变成了副类的主辅助构造器,而我们知道辅助构造器调用之前也得先调主构造器,所以如果加上这个现在在运行的过程,那就变成了每次创建student类的对象的时候,都要调用副类的主构造器和辅助构造器,接下来才是当前如果调用的是主构造器,那就是主构造器,如果是辅助构造器的话,那还有主构造器和辅助构造器都要调用,所以大家看到中间就加入了副类的辅助构造器的调用。
15:14
这关键在于我们继承关系的时候,继承extend后边相当于就是父类构造器的调用,到底调哪个就看传哪个参数。这就是关于继承关系的一个测试。
我来说两句