00:00
那我们知道了继承的这个基本语法过后呢,我们就来一个快速入门案例,这个案例很简单,我们就用什么呢?我们就用继承的方式来解决前面这个学生管理系统的事,OK,我们通过ten go改进,我们对前面那个文件进行一个改进,使用嵌套匿名结构体的方法来实现基层特性,请大家注意这样编程的好处,那我们走一下这个快速入门案例。就说就用继承的方式解决前面的问题,大家看一下代码,它是不是就变得简洁了,对不对?来一个快速入门案例。好,把这个地方的这个需求给大家拿过来,好吧。OK,大家领会一下,好给他一个板书。然后呢,我把这个示意图也拿过来。这有一个示意图。好,现在呢,我们就来走一下代码,好吧,我们就就来走一下代码,看看怎么改进。OK。
01:00
那现在呢,我们代码走下代码。代码实现。OK。那打开我们的这一个Vs code,我们就在这个基础上改进,好吧,我我们就在这个基础上改进就完了,那怎么改进呢。非常简单,你看我这样子啊,我们就直接直接在这改了,好吧,我也我也不去呃,不去弄,因为这个源代码也给大家保保留过一份,我就不去动它了,大家看怎么改,首先。首先呢,我按照刚才这个思路,先抽取出来一个共有的结构体,叫student。我不管你是小学生还是大学生,你们都是学生,对吧,Student。好,然后呢,也是一个structure,没这个没问题吧,我把这个属性是不是现在他们两个pupil和graduate他们共有的属性都有这三个,是不是我把它。捡走。能理解吧?我把捡走,当然你这捡走了过后,同样你这块保留也就没啥意思了。
02:04
是不是这意思,就我我都给,因为都是共有的,我都给你拿走吗?那么拿走过后,同学们看到你student,呃,就是你pupil,呃,你看pupil有三个方法。这个graduate呢,也有三个方法,大家发现这两个方法他们是共有的,于是乎我把这两个方法也写到这来。将。将pupil。PU和什么呢?Graduate graduate。共有的。共有的方法也怎么样,这个绑定到。绑定到哪个呢?绑定到student这个类型。对不对,我们仍然是指针,这个没没问题吧,我们就开始写,那怎么敢保定呢,非常简单,就放,然后这边写上s to对吧,Sto星号ST student,然后呢,他同样这个名字,我们还叫show for,没,没有问题吧,好,写完写完过后,呃,我把这句话呢拿过来用一下就可以了。
03:09
能理解这意思吧,当时当然当然这个地方你就要改成student。是不是要改成student这个呢,也改成student。没没有问题,好,当你把这个做完以后,其实这个方法就已经没有用了,为什么没有用,因为我把它提走了,所以这个呢就删掉了,同样你这个graduate呢也会删掉。没,没有问题吧,删掉,同样他们还有一个set score这个方法,我也把它拿进去。对不对,那就fun。S新s student,然后呢,有个site score。同样有个靠这个方法,Int。没有返回值对吧,没有犯罪,好,我把这句话呢也拉进去。好,待会把这个方法也写完过后,同学们,你这个pupil里面的这个方法也可以。
04:00
退出历史舞台了,不要了。对吧,不要了,同样这边这个给他设置乘积,这个呢,咱也不要了。好,那有些同学老师这个方法还要不要保留,注意testing和这个testing他们两个是不一样的,为什么呢?你看它的内容咱们没法合并,只是我这写的函数名字一样而已,刚好就一样,其实也有可能是不一样的,对吧?因为这两个呢,我们认为这个testing和他的testing我们认为他们是不一样的,因为小学生考的成绩呢,考试的内容呢,跟大学生考试内容它其实是不一样的,咱们呢,就可以把它放一放,就说保留他特有的,这个就是就相当于是他特有的方法。这是pupil。Pupil结构体特有的,呃,特有的方法或叫独有的方法都可以。特有的方法爆料。保留?为什么保留?大家看一下我的示意图是不是这样写的,特有的字段和特有方法可以保留。而且你不但可以保留,而且还可以增加。
05:01
同样道理。同样道理,我们这个graduate呢,也可以保留。对吧,这个也是我们graduate特有的方法,我也把它保留。这个大家看看能不能理解,当然当我们这样做完了以后,注意听,当我们这样做完以后,你这个时候去使用的方式肯定不一样。不一样了,这个时候注意听你这样写完了过后,你还没有忘了一件事情,如果你这里面没有嵌入这个student,那我告诉大家,你这个pupil其实什么属性都没有。他只有一个方法而已,同样,Graduate也是什么属性都没有,它只有一个方法。那怎么样让这个pupil能够使用到上面的东西呢?非常的简单,只要这里写一个student就可以了。可以了,这个就是我们嵌入了。嵌入了这个student的一个匿名结构体。什么叫匿名结构体,就是这个结构体没有名字,就是它没有变量名,因为因为我们一般来讲是这样写的嘛,Sto。
06:04
这样写。SQ就说这有一个变量啊,这有个字段,它的类型是student,但是呢,你不需要写。相当于把它嵌进去了,注意啊,这个地方保留一个匿名的结构体就可以,同样道理,这个地方也保留。大家看到没有,代码是不是已经减减少了很多呀,你们发现是不是减少很多,你看PU,其实这里面就有一个student,还有一个方法,而graduate也是只有一个student,然后还有一个方法没了。但如果你要写大学生,你要写大学还要写其他学生,一样可以这样做,那用的时候肯定跟这就不一样了,那么我们来把它改一下,怎么使用。来吧。我们来使用一下。当我们。嵌入了,当我们对什么结构体,对结构体嵌入了。嵌入了匿名结构体后。
07:00
结构体后使用的方法,方法会发生变化,会发生变化。那怎么变化呢?听我说我们来,我们来写一个这个吧,我们是说小学生这个事啊,那首先呢,我们来创建一个pupil,好吧,我们创建一个pupil,那他看我怎么写。We are。对。PUPIL。对不对,我们就这样写吧。嗯,就这样写就行了。PU PU piil,来一个类型推导,然后呢,我就直接来个pup PU piil。拨起来,所以我们给他一个引用对吧,把这个指针给他付给去,当然同学们想象这个时候PU里面其实是空的,什么内容都没有是吧,他的任何一个字段信息都没有,那怎么办呢?给他赋一下值。注意听这个很关键啊点,因为这个pupil它的匿名结构体名字叫student,但是字段是在哪里呢?是在这儿,所以说我们要用的时候呢,一种方式比较简单,方式这样写,我们先写第一种方式啊点。
08:10
这因为这种方式大家先接触一下,但是后面还有别的方式,我再说,我们先用一个大家最容易理解的pup点到这个匿名结构体,再取到它的name。最大看一下能理解啊,然后呢,给他一个名字,比如说叫汤姆。汤姆。然后我们再给他一个pupil。点student是不是他还有一个年龄呢?年龄好等于比如说他是小学生,小学生我们来个八岁。写完了,那么现在这个做完了以后,我们就让他进行一个考试,那考试的话,我们调的是谁的方法,调的是实际上是student里面的一个方法啊testing啊,Testing他自己的方法,对吧,Testing是他自己方法,我们就调一下就。pu.testing。
09:00
第二胎体。好,这样子就能调起来,但是调完了过后,他考试完了过后,是不是要给他设置分数了,设置分数怎么设呢?还是老规矩点。找到它的匿名结构题点什么呢?Site。这个score。对吧,当然后面还有别的方法啊,我们先用这个最大家最容最容易理解的,你看这是结构体的名称,找到它的匿名结构体里面的set score,这个层级关系还是很清晰的。那么我给他写一个考试成绩,比如说是70 70分。好,70分完了过后我们把这个成绩输出来,pupil.stu。点什么呢?So for。好,写完了。那这个时候我们就这样去用的啊,当然我说了后面还有简简洁的用法。我们现在先讲一个,就是最通用的用法,大家也容易理解的用法,后面我们再去讲其他用法,好这这种用法是最容易理解的,好这个时候呢,我们看代码有些问题,看哪里出了问题看一下。
10:02
啊,他说这有个问题,是不是我们这少了什么呀。是不是少了这个东西啊。好,这一个score,我们看这地方是什么问题。啊,他说没有定义这个,那是不是因为这没改呀。是不是这个student score还有什么错误没有?没有了啊,没有错误的话,我们来用一下,看看此时此刻我们能能否用成功,就是看看到底我们使用那个嵌入匿名结构体过后,这个代码能不能正确的跑起来走一下。运行。我们可以看到完全没问题,看小学生正在考试,他是汤姆,年龄18岁,成绩70分,那同样大家想一想,如果我们要去对大学生考试,是不是以此类推?是不是以此类推,也是这样,掉一下就完了,跟前面比起来也是一样的道理,比如说现在我们来做一个大学生。大学生的话呢,我们这改成一下啊,我就统一改,诶这个还不能统一改啊。
11:00
Graduate。Graduate,没问题吧,我把这个都统一改。Graduate里面有个student匿名结构体,它这些方法都有。唯一要改变的这这个地方,我们创建的是graduate。Right do it完事,那么大学生,我把它改个名字叫Mary。Mary。那么Mary的年龄呢?比如说是28岁。好,我们再来试一下,看看成绩,给改一下,成绩改成90分。跑一把。看看代码能否跑起来,我们可以看到完全没问题,看到没有大学生正在考试。学生的名字是Mary,年龄28乘体七九十分,没问题,这样子呢,我们就通过这么一个案例,使用到了我们一个匿名结构体,通过匿名结构体这种方式呢,我们体现出什么呀,勾浪里边的面向对象的什么呀,就是。继承的这么一个特性,大家看到是不是这种继承跟我们传统的继承区别还是蛮大的。
12:00
传统的精神就是这样子的,对吧,然后把这个什么一写就完事了,但是呢,他这里呢很松散。其实这种方式啊,你们慢慢去体会,它有很多好处。因为大家都知道学Java语言的时候,呃,学编程编的编程语言的时候,就是继承的关系,其实很很不不太容易搞清楚,但是他在这个地方,他这个勾当设计者,他很简就很简单,就说你要用什么,你把它嵌进去就行了,而且层级关系他仍然给你保留。那就想既然有有一个层级关系的话,我们就是要访问到哪一层,直接点点点就完了,对吧,就不存在这个什么其他的那个就是很很容易让混淆的地方,他尽量让你的这个代码没有混淆的地方,就是勾让设计者的一个初衷,那么代码看起来其实更简洁啊,更简洁也很松散,好同学们,那么我把这段代码呢,给同学们放到笔记里边去,大家体验一下。OK。因为代码比较多,我就直接把源代码粘过来好吧。来,放到表格里面去,这是我们的源码。
13:03
好,可以了。好,上面这个案例呢,就是我们一个关于结构体的一呃,就就是关于这个继承的一个案例,大家体会一下。好,那么把这块代码呢,再说一下,再总结几句啊,继承给我们编程带来的便利有哪些?其实前面已经说过了,再总结一下,一个代码的复用性提高了,第二个代码的扩展性、维护性提高了,那么怎么体现出代码的扩展性和维护性提高了呢?非常简单,你看啊。比如说我希望给graduate和这个pupil。和这个pupil增加一个方法,他们共同有一个方法,什么方法呢?他们都喜欢称,他们都可以做算术题,你看我只需要在这绑定一个方法就可以用了,你看啊。比如说我增加一个方法,或者增加一个属性,他们马上都同时都拥有是吧?我在这里给student。
14:00
新增加一个方法。对吧,增加一个方法。增加一个方法,那么那么什么呢?Pupil。PU PI pup和谁和?这个就是我们所说的这个graduate。Graduate。Graduate都有这个方法,都可以使用该方法。那比如说我写一个。比如我在这写了一个什么方法呢?做算术题的方法,比如说get some。好,我让他给我传两个数进去,N1。再来一个N2。Inch返回一个结果怎么做,非常的简单。N1。加N2就可以了,那么当我这样一做过后呢,同学们,你这个pupil,还有这个graduate就可以马上用这个方法,你不你不需要在每个这个就是每个这个Q每就下面嵌入student里面的这个类,这个结构里面再单独写一份,因为它可以共用,你看我试一下啊,然后说在这他们要要计算一个结果,我might。
15:11
比如说我们说说一个result等于。好,Pupil student。点get。我看是大写还是小写啊。我这写的是小写的啊,我们还把它大写一下吧,Get some。Get。那get上的时候呢,我要传两个字,一和二写完了,同样我在下面要去计算一个结果,我也可以通过graduate来做,因为它这里面也有student,他也可以用get some,对不对?那我写个十和二十来,同学们我们跑一下。是不是应该代码没有任何问题是吧,三和30可以。就这么简单,就是扩展起来很很方便很方便,当然你要去掉一个方法也很方便,对吧,你要增加一个属性也很方便。好,同学们,那关于这一块呢,它的便利我们就先简单的给大家说到这里,就是举这个案例来让大家实际的认识一下继承的一个优越性,好吧。
16:10
好,我把它给同学们整理一下,这是标题三。对吧,两点,一个是代码复用性提高了。第二点呢,就是代码扩展性维护提高了,好,同学们,那关于继承的这个快速入门和它带来的便利分析,我们就先给同学们讲解到这里。
我来说两句