00:00
好,同学们,我们接着来看一下接口和这个继承之间的关系。在前面呢,各位同学,我们是不是已经把接口这个呃概念以及它的应用给大家做了一个介绍。那么我们也写了一些案例。那这个时候呢,有些同学可能对接口和继承这两个概念呢,容易比较混淆,对不对,那所以说呢,我们来一起看一看接口和继承它们之间有什么区别,我们来做一个讲解,同学们来看一下这个图。同学们看到这个图了没有?这有一只小猴子。这有一只小猴子,这个小猴子呢,继承了老猴子,大家看到我用这个图标呢,表示一个继承的关系。假设小猴子继承了老猴子,那么这样子呢,就是这个老猴子用所拥有的这些能力,包括他的字段,包括他的这些方法呢,就会自动的被小猴子继承,这个呢,小猴子不需要做任何的处理,就可以拿到他的这个这个老猴子的这些字段和他的方法,这个大家能能理解吧,因为他是继承关系。
01:09
但是呢,我们说有这么一个情况,比如说这个小猴子。他呢,不安于现状,他可能说,诶,我除了会爬树。但是呢,他还想希望像小鸟一样飞翔,希望能够像鱼一样可以游泳,那这个时候呢,他就要去干什么呢?可以通过一种实现的关系。通过这个实现接口的方式来增强这个小猴子的能力,对不对?那么我们现在就可以这么去想,这是一个结构体,这又是一个结构体,那么当这个结构体继承了这个结构体之后呢?那么这个结构体就拥有了继承的这个结构体的字段和方法,但是如果这个结构体他希望去扩展他的一些方法,而且不破坏基层关系,那么他就可以用实现的方式来做,比如说小猴子通过努力可以去。
02:04
干什么呢,实现能够飞翔的这个功能,通过这个学习呢,可以去实现像小鱼一样游泳的这个这个功能能理解我的意思吧,所以说你们可以看到,我们可以理解成。这个接口是对继承的一种什么呀,补充。那么我说了这些东西过后呢,同学们可能还是不太明白,好,我们现在呢,把这个给大家举个案例,大家来实际的体验一下来吧。我们来走一个,这个叫实现接口和继承之间的一个关系。Lawyer,我们给他一个标题,给他一个我的标题三能理解哈,好,我们先来看第一个。第一个呢,就是来看看他们的一个关系,用一个案例来讲一讲,来给他板书一下。下面呢,我们同样。我们同样把这个比较经典的图给大家也放到笔记里面去。
03:03
这是一个冰比较经典的图,大家看到没有,这个猴子之间呢,是继承,如果这个猴子想去学小鸟飞翔,像鱼一样游泳,那么就是实现接口的这样一种关系,相当于是对继承的一种什么呀,补充能理解吗?好的,同学们,来,我们走一段代码。我们走下代码。代码说明来吧,各位朋友,那现在呢,我们在这个CHAPTER11里面新建一个文件夹,叫什么呀,叫interface,然后呢,继承。对不对VS继承。能理解我的意思吧,好,现在呢,我们新建一个文件,就叫main.go走一个老规矩,那么为了推一个懒呢?我们把上面能够共用的部分拿过来为我所用。好吧,然后现在呢,我们写一个主函数。
04:01
跟上老师思路啊,那现在呢,假设我这有个猴子类猴子结构体,这有个monkey。结构体写上啊,那我就type monkey monkey别写错了啊。好,然后呢,它是一个structure,假设我们这个monkey这个结构体呢,有一个名字。对吧,有个名字,同时呢,它还有一个方法能理解,我们说猴子呢,生来就会爬树,所以说我们给他一个方法会什么呢?会爬树的方法,This新monkey能理解啊,然后climbing。Climbing爬树的意思,好,我写一句话啊,四个亿。我们写到这。This。That's your name。OK,那写句话叫生来会爬树,生来会爬树能理解。
05:00
好,这是它的一个方法,大家看到,那也就是说这个结构体呢,这个monkey,这个结构体我们给他绑定了一个方法叫什么呀,叫climbing,能理解这意思吧。没问题吧,好,现在呢,现在各位同学像这样子啊,我们再来定义一个little monkey结构体。Little Li,然后呢,在这里我就推一个,懒了我就复制一份。能理解好,我把这个地方改成lile,然后呢,名字我们不用,我们直接去继承这个monkey。我用一个匿名结构体,大家看到这是匿名结构体,我问大家一个问题啊,此时此刻,如果我去创建一个little monkey这个结构体的实例。或者说他的一个变量,请问我能不能用这个climbing这个方法。显然我是可以的,为什么?因为我继承他。是不是这个就相当于是个继承的关系。
06:02
是不是通过这种方式来实现这个继承的,那么我们来看看啊,我们来看一下是不是这样子的,我来创建一个。创建。一个little monkey的实例。各位老师思路哦,那么我就写个monkey。等于什么呢?我们就来创建一个monkey啊,创建一个little monkey。看清楚了,这个little monkey里面呢,它有一个匿名结构体,对不对,好,我直接给他搞定。然后呢,给他一个名字,这个是不是我们学过的name,给他一个名字叫悟空。大家都知道悟空啊,很厉害,悟空。悟空是一个小猴子,那现在呢?问大家一个问题。此时此刻,这个。Little monkey的实力,能不能调用这个monkey里面的这个方法回答老师一下。
07:00
显然是可以的。因为我继承了他吗?我既然继承了他,我就可以使用它的属性,呃,使用它的字段以及它的什么呀,方法没没问题吧?好,此时此刻我们来调用它一下。On k点。那因为时间的关系呢,我就把这个粘贴拷贝一份。好朋友们,我们来运行一下这段代码,看看能不能跑起来。好,这边有个问题,我们看哪里写错了。哦,这边是不是少了一个括号啊。少一堆括号。好的,现在我们看看还有哪地方有问题。哦,这边应该少了一个什么逗号,别忘了对吧,好,现在我们来运行一下。Climbing。这个地方要用一个,呃,用一个类型推导。用一个类型推导就OK了,好,我们来把它跑一下吧,同学们。跑一下找到我们的地盘。Project。里面有个SC,里面有个go code里面有我们的刚刚写的11,是不是里面有一个interface和继承的这么一个文件夹。
08:12
好,写错了,这地方应该写错了啊。关闭一下。好,刚才呢,老师这写错了,我们重新来。叫CMD。好,我们来运行一下go。让什么呀,命点go跑起来,我们可以看到此时此刻他说出了一句话,叫做悟空生来会爬树,那同学们可以看到说老师你写你写的这些东西不是前面都已经讲过了吗?的确如此啊,的确如此,我确实是讲过的,但是呢,现在我们想做对他做一个扩展,我要做一个什么扩展呢?各位同学请看,假如。这个小猴子,他很想去学习小鸟飞翔,想去学习鱼儿游泳。那这个时候作为一个设计者,你会怎么去设计这个需求呢?
09:04
各位同学,站在设计的层面,你会怎么考虑?有一种方式,有些同学说,老师简单吗?我只需要。在这个monkey这一层,直接给他来一个flying,这个方法不就可以了吗?是不是就可以了吗,Flying?飞翔,但是你想一想,猴子本身它是不会飞翔的,对吧?你写个飞翔方法显然不合理。只是说这个小猴子它比较特别,这个这个结构体,这个小猴子这个结构体呢,比较特别,他他希望他有这样一个功能的扩展。但是呢,他又不能直接把这个方法直接写在猴子这个结构体上,给他绑定到这个方法上,为什么?因为猴子本身它是不会飞翔的,只是说这个结构体它想扩展一下,这个能怎么办,我既不想破坏这个继承的这种合理性,同时呢,我又希望让这个little monkey拥有flying的这样一个功能,怎么办?接口搞定,所以说我们可以看到接口其实就是对继承的一个什么呀。
10:09
补充能理解吗?好的,各位朋友,那么现在呢,我们来走一个代码。好,我们现在呢,定义接口啊,声明接口也可以叫声明。接口。跟着老师思路啊,那现在呢,接口大家还知道我们是怎么写的吧,Type type,然后呢,比如说有个鸟儿的接口。Bird able,然后呢,Interface在这里呢,我去声明一个方法啊,写一个方法,那这个方法呢,我们就叫flying。FLY。没问题吧拉好,除此之外呢。好,我们这个方法写完了过后,我们就能让它实现,让这个小猴子来实现,它看到没有,所以说大家看这个图的关系是小猴子这个结构体去实现,这个方法能理解吧,但是呢,并不影响这个老猴子这个mountain这个结构体。
11:06
不影响明白吗?好的,那现在呢,我们来写一下。让谁呢?让little monkey实现。实现。哪个方法FLY?实现这个接口。实现这个接口。这写错了。实现。OK,那实现这个方法是不是非常的简单啊,是不是就是。Funk now this。然后呢,我们让这个little monkey。好,这个little monkey,那没有办法,我得把它提到前面去,因为你这要用嘛,对不对,所以说呢,我把它也提到前面去,这个没没毛病吧。这个没毛病。好,我可以让他写到这来。没问题吧,好,然后呢,我把这个little monkey写到这里,我要实现这个bird able这个接口,那怎么办?是不是就实现这个方法就可以了,我们说实现接口其实就是实现接口里面声明的这些方法是这意思吧。
12:07
好的,我来写一句话。我就说这句话啊,这点name。This name。说通过学习。通过学习会什么样会飞翔了?飞行。好,那大家看到此时此刻呢,因为我这一个little monkey,它实现了这个接口。因为这个接口呢,他可以定一些规范嘛,对不对啊,他可以定定一些规范,好,那这样子的话呢,同学们想一想,此时此刻我们这个小猴子呢,就可以分享了,但是原先这个monkey没有受任何的影响,这一点是关键。这点是关键,好,我把这个呢写到这里,Monkey点。好朋友们,我们跑一下这个代码。我们跑一下这个代码跑起来啊,这个我们先关掉,打开这个走。
13:02
我们可以看到,现在呢,悟空通过学习就会飞翔了。哎,大家有没有一种体验,一种感受,什么感受呢?就是说我们通过这个实现接口能够扩展这个little monkey的一个功能,但同时我们并没有影响monkey以及他的继承关系,我们并没有影响,能理解这个对吧。好,同样我们再把这个也实现一下,比如说我还想让这个小猴子像鱼一样可以飞,呃,游泳怎么办呢?也非常的简单,我们再来声明一个接口,大家看到没有?大家感受到它的一种灵活性,对不对?我们叫fish able,那么鱼儿会什么呢?会swimming。S。S swim swimming。对吧,Swimming好,那现在呢,我们也来实现这个方法。好的。我把这个粘贴复制一份,可以实现什么呢?Fish?
14:02
Fish able。是这意思吧?好,我们让它实现swimming。Swimming,这个方法好,写到这里来,通过学习会什么呀?会游泳了。完事,那这个时候呢,我们再来让这个小猴子,让这个monkey调用swimming这个方法。单看效果。我们一起玩,我们再来跑一跑。跑起来,我们可以看到。悟空通过学习会游泳了,好,通过这个案例,大家是不是有有一点感受对吧,是不是感受到我们这个接口。这个实现接口和继承之间的关系是什么样?其实简单的一句话就说接口实现接口可以在不破坏继承的这个关系的基础上,对我们的一个结构体进行功能的扩展,这就是一个经典的一句话,就说实际上呢,它是一种解耦的一种方式来扩展我们某个结构体的这个功能,能理解吧,但是呢,同时我们并没有破坏这个继承的关系。
15:09
能理解,就是在设计层面上,我们并没有破坏这个精神关系,同时呢,我们要让这个小猴子的功能进行了扩展,就这么经典的一句话,好,那关于这段代码呢,我们把它给同学们整理到笔记里面去,没问题吧?但应应该有所体验,对不对,应该有所体验,好来,我们现在呢,把这段代码给同学们板书一下。板述一下来接一下。好的,这个呢,我们截取到第23行。对吧,我们截取到第23行。跑一下。放到我们的笔记里边去。当然,紧接着咱们继续崛起。从第23行开始,截。24行对吧。好,24行到46行。
16:00
继续截取。好,紧接着呢,我们最后还有一点扫尾的几行代码。就46 47行开始截取。对不对,每一行呢,咱们就把它截到位。17。欧了。好,这个呢,就是一段代码的说明,那么针对这段代码呢,老师总结几句话好不好好对上面。对上面代码的一个小结。好,通过上面代码我们得出了几个结论。第一个结论。第一个结论,继承是什么呢?所谓继承,就是当当一个结构体。结构体继承了,继承了。另外。另外一个结构体后。结构体,那么比如说A结构体吧,当A结构体这样子比较好说,当A结构体继承了B。
17:00
B结构体,那么A结构体。结构体就可以。就自动的啊,就自动的,自动的人就自动的继承了。继承了B结构体的字段和方法,并且可以直接使用。直接使用这个没毛病,那么第二个问题呢,就是说当A结构体,A结构体。接。结构体需要扩展,某个功能就扩展。扩展功能。同时同时又不希望,同时不希望去破坏。去破坏啊,就是说叫破坏什么呢。破坏这个继承关系。继承关系,则则可以去实现某个接口。
18:00
实现。去实现某个接口即可。接口。接口即可啊。所以我们可以看到,我们可以这样下一个结论,就说实现接口这个机制其实是对继承这个机制的一种补充,理解意思吧,因此我们可以认为,因此我们可以认为,认为什么呢?就说实现接口。接口。是对,是对继承机制的机制的一种补充。哦,OK,就这么几句,就这么两句话啊,如果同学们在面试的时候,有老师,有这个老师或者面试官问到这个问题呢,你就按老师这样一种方式给他简单的给他分析一下就可以了,他应该能够理解好同学们那关于实现接口,接口和这个继承的第一他们之间的一个区别呢,第一部分我们先给大家介绍到这里。
我来说两句