00:00
那我们再来看,就是把刚才实现接口和继承。这个之间的关系呢,再给大家再说一个啊,再说一个之间的区别,我们来看一张图,同学们看一张图,大家看到这里,同学们注意观察。此时此刻呢,大家看到这有一个运动员,假设这个运动员呢,他是一个结构体,明白,那这个运动员呢,被篮球运动员和足球运动员这两个结构体给继承了,这个没有什么问题,对吧?这个没什么问题,那么我们再看学生。学生这个结构体呢,被大学生和中学生这两个结构体也继承了,这也没什么关系,现在呢,我们有这么一个需求,同学们请思考。现在老师提这么一个需求。什么需求呢?这样子的说。现在我们要求足球运动员和大学生。掌握英语。
01:00
大家再再听我说一句话啊,现在我们要求足球运动员和大学生要去掌握英语这个技能。请大家思考一下怎么实现?当然有这么几种实现方式。第一种。你直接把学英语技能这个方法写在运动员这个结构体里边去,但这有问题。大家知道什么问题吗?因为如果你写在运动员这个结构体里面去的话,那就意味着篮球运动员本身他不想学英语,他不需要掌握这个英语技能,他也掌握了,被动的接受了,所以说你直接把这个方法写到这个地方不合理。同样的道理。如果你把学英语这一个方法。写在结构体,写在学生这个结构体的话,那中学生他也被动的要去学英语了,这样也不合理。大家能理解我的意思吧,所以说你看到用继承这种关系呢,不太容易搞定这种需求。但是还有一种一一种可能说老师我可以这样做,我直接把这个方法,注意听我这句话,我直接把学英语技能这个方法直接写在足球运动员这上面去,那么足球运动员不就可以去学英语了吗?
02:15
同样,我再把大学生这地方也给他,也给他绑定一个方法,让他去学英语,这样不就满足了足球运动员和大学生都可以学英语这个事情了吗?理论上这么一说好像是可以的,但是大家有没有注意到,你在足球运动员添加一个学英语的方法和在大学生这个结构体添加一个学英语的方法有什么不好的地方?大家有没有发现?至少有一点肯定不好,就是规范性不好,因为足球运动员他在写这个,呃,写这个方法的时候,和大学生学这个,学这个学英语的方法的时候,有可能这个规范就出现了偏差,能理解我的意思吧,就因为你这个项目。
03:00
你希望他这个是有规范性的,你并不希望足球运动员去写一个。学英语的方法和这个大学生学英语的方法不一样,他的规范不一样,比如说他的名字不一样,他的参数不一样,你并不希望这样子,对不对?做一个项目来讲,肯定希望我们这个规范性,因此这个时候用接口来实现其实是特别好的,大家看这样做。我去定义一个接口,就要学习英语的技能的,这么一个接口里面呢,我定义相关的方法,然后我让足球运动员和大学生来实现这个接口就可以了,这有什么好处?大家想,第一个我让足球运动员去实现这个接口,不会影响到篮球运动员,也不影响到。这个运动员。我让大学生去实现这个接口,不会影响到这个结构体和这个结构体,所以说它解耦了,这是第一个好处,第二个好处。第二个好处,因为我这个接口呢,是事先定义好的,我让足球运动员和大学生都来实现这个接口,有一个特别好的地方,就是这样子的话,这个规范性就得到了保证。
04:10
为什么说得到了保证,因为你足球运动员实现的是这个接口,大学生也实现这个接口,显然这个规范性就得到了保证,因此接口真的是很好,只是大家可能目前呢,因为你们现在还没有大量去使用接口,可能没有感觉到它的妙用。对不对,但的的确确啊,接口这个确实可以解决很多这个问题,第一个不破坏继承,第二个规范性还能够得到保障,能理解我的意思吗?因此呢,同学们,我们再次体验到接口可以看作是对继承的一种补充,没有任何毛病啊,非常的非常的不错,好,那么我把这个呢也给同学们板书一下。能理解好,我现在呢,定位到这个位置。是不是是不是刚才喂这个地方。
05:00
怎么?好在这。我们把定位一下。走一个。那同时呢,我们把这个比较经典的这个图也给大家。板书到我们的笔记里面来,大家一看呢,就能知道接口和继承对不对,他们之间的一种一种关系。好,我把它放到这里了,接着我们继续往下看,同学们,我们接着来再看接口和这个继承他们之间的关系还有哪些呢?大家看这里。啊,大家看着接口和继承解决的问题,他其实是不一样的,注意听这句话啊,比如说面试官在问你接口和这个继承他们着重解决的问题是什么,你必须给他回答上来,比如说我们说继承的价值。继承的价值主要解决的是复用性和可维护性,能理解我的意思吧,就说继承真正的价值主要是解决代码的复用性和可维护性,大家体验一下,就说我们可以让一个结构体去继承另外一个结构体。那么这个。
06:09
结构体,它有些重复的代码不需要再重复写了,因此复用性就可以解决,可维护性又怎么样呢?比如说我让这个。这个。这个那个就说被继承的那一个接口,增加一个方法。对不对,那其他的这个接口呢?呃,其他这个结构体呢,也就相应的拥有了这些字段和方法,因此呢,可维护性也提高了。那么接口的价值又在于哪里呢?注意听讲,同学们,接口的价值主要在于设计,这一点特别的重要。接口真正的价值主要在于设计,因为他设计好各种规范。说白了,这些规范就是一堆方法,能理解我的意思吧,就是说接口里面声明的这些方法,然后呢,让其他自定义类型去实现这些方法即可,因此接口的价值更多的是在于设计,尤其是在勾浪语言里面去,大家可以看到在我们去讲这一个。
07:10
接口的最佳时间案例的时候,大家应该可以感觉到接口的这种威力,对不对,它因为它可以设计好很多规范,你只要去实现这个接口了,好的我就可以用了。所以这一点是真的很很很方便的,对不对,所以它的价值呢,更多的是在于设计能理解啊,第三点,接口比继承更加的灵活。为什么这么说?尤其是在勾浪里面,这个接口它还是一种很松散性的一种实现机制,对不对,所以说呢,它比继承更加的灵活,更加的方便,打个比方接口呢,呃,继承它是满足1A的关系,打个比方。你这有一个student。比如说你你这有个这样的啊,比如说有个person。
08:00
Person。这个结构体。那么我们再来看有个学生。可以看到。我们说person和人和person和student呢,他是一个is a的关系,比如说我们可以用说学生是不是一个人,当然他是一个人,因此呢,我们就说这种这两者他们容易构成的是继承的关系,他是一直呃的关系。但是呢,这个接口它只要满足like a,就是像一个什么样子就可以了,你比如说前面我们写了一个接口bird。大家还还有印象吧,Bird able,然后呢,我们有一个,呃,那个结构体叫little monkey。Monkey,你看他们就可以,你不能说一个猴子是一个鸟,对吧,但是呢,你可以说一个猴子可以像小鸟一样飞翔。就说我通过一种功能的扩展,我可以让这个结,这个结构体呢,它的功能得到一个扩展,它是like,因此我们可以看到他们之间的关系要弱于1A的这种关系。
09:13
能理解我的意思吧,就是说它是比较松散的一种关系。明白啊,大家体验一下啊,大家体验一下,那么我们再来看第三一点接口呢,在一定的程度上可以实现代码解耦。这个就不多说了。尤其是在勾浪里面,它这个接口啊,还是一种松散性的实现,因为它并不需要去指定你实现的是哪一个接口,你只需要去实现这个方法就可以了。大家看我们的代码里面再体验一下,你看在这里同学们看,我们找到前面我们写的这段代码。看看这里,你看我们在这里有一个little monkey去实现了FLY这个方法,但是我并没有指定这个方法是这个接口里面的。
10:00
他重点就是说它是基于这个方法来实现这个接口的,能理解吧,所以我们可以这样认为,接口呢,在一定程度上实现了代码的结耦,非常的灵活。非常灵活,好,那关于这个接口和继承之间的这几点关系呢,我们给大家板述一下,走一个。来。板书一下啊,同学们。板述一下。好,第一个呢,就是接口和继承,他们要解决的问题是不同的。这一点大家要有一个认识。他们两者的,呃,一个是解决复用性和可维护性。对吧?而接口的价值呢,更多的是在于设计,它设计好很多的规范,让其他的自定义去实现。接口了。接口还比继承更加的灵活好,这点呢,我们也把它整理一下。
11:05
还有接口,在一定程度上它实现了代码的解耦,说我们总结了就是这么几点,大家看清楚了对不对?啊,一个是他们解决的问题不一样,一个接口比继承更加灵活,因为他的关系呢,相对来说比继承要弱。大家可以体验到这一点,那接口在一定程度上呢,它实现了代码的解耦。好,同学们,那到此呢,关于继承和接口之间的一个关系,我们就给大家讲解到这里,大家呢,认真的去体验一下啊,认真的去体验一下。好的,我把这个呢给大家截一个视频。
我来说两句