00:00
各位,我们一起来完成接口的几个课堂练习题,好吧,然后呢,大家动动脑筋,动动脑筋,来,我们一起看一下。呃,首先我们看这这这样这第一个第一个案例,这是不是定定义了一个接口里边呢,有TEST01和TEST002这两个方法对不对,好,紧接着它定义了一个B接口,里面有TEST01和TEST003这两个方法没问题吧,然后呢,它这有个student这个结构体,这个结构体呢,它实现了。它实现了TEST01。它实现了TEST02,它实现了TEST03,也就说也就这么说吧,就是你这个student这个结构体呢,呃,我干脆放大一点,可能看起来有点吃力啊这样子。来看,就是现在呢,就是student这个结构体,它实现了A接口和B接口,这点大家能确认对不对,紧接着他做了什么工作呢?大家看这里,他把一个student的呃,创建了一个student,呃结构体的变量,然后他把STU交给A这个接口,把STU交给B这个接口,请问。
01:08
嗯,这两句话OK还是不OK?肯定是可以的,因为前面其实我已经做过了,因为你这个sto这个变量对应的类型是。这个大写的sto这这个结构体,而且这个结构体呢,它确实是实现了A和B的这个方法,尽管这里面有一个零一,大家看都有零一无所谓,我刚才讲过啊,我再说一遍,就是说至于至于你这个这个test的零一是A接口的还是B接口的,它根本无所谓。他关心的就是你这个方法有没有实现,这个方法只要一致就可以了啊,注意啊,这个方法一定要完全一样才行,就是包括他的这个参数类型这些都要一样啊,就是参参数参数要一样啊,就还这个方法要一样才可以,那这个test的零一呢,我们可以理解成它既实现了B里面的test的零一,又实现了A里面的它等于一,这是可以的,所以说这个地方肯定是OK的。
02:04
同样这个也是OK的,所以说这个代码是正确的。能理解吧,就第一个这个代码没有问题,我们得出的结论是什么?我们得出的一个重要结论就是说在实现接口的时候,它的标准只看函数,而不看你是哪一个接口。它是基于方法的接口,它是基于方法来实现的,能理解好,我们再来看下面这个题,下面有没有错误,大家看这有个接口,TEST01 test02。B有个B接口,有个T01T03 C也有个接口,这里呢,大家看到它把A和B2个接口继承到C里面来了。好,同学们,想想这个时候会出现什么问题?如果说这你把A和B2个接口都放到C这个接口里面来,相当于继承了,那就问题比较严重了。为什么说这个问题比较严重?
03:03
好。看一下啊,别忘了录制这个视频。那为什么我说这个问题比较严重,大家看到就是因为你这个A接口B接口里面都有TEST01。那就问题难,问题麻烦了,就相当于说你在这个接口里边,在C接口里面,你有两个TEST01这个方法。是相当于说你这有你继承下来有两个完全相同的TEST01这个方法,那想一想。还能跳的过去吗?肯定编译器直接直接就给你报错了,那就意味着我们这个接口之间啊。不管你是什么关系,你继承多少次,但是绝对不允许有相同的方法名,如果你有相同方法名,那这个地方肯定就是过不去的。你看前面这个呢,你看我16帧在实验的时候,他们是分开的,0101030,它是分,分别在不同的接口,而你现在搞了一个什么呢?把这一大块打到这里面去了,又把这一大块打到这里面去了,那就相当于我们这个C里面有两个T等于一,因此编译器直接报错。
04:07
好,我写到这里。这个代码是错的。这个编译错误。编译错误。因为因为为为什么说编译出呢?因为就是你这个,呃,C相当于说你这个C接口里边啊这个C。Interface中。C in。Interface有什么呢?有两个,相同的有两个。两个test的联系方法,因此它这个编译器通不过的。啊,编译器报错。编译器无法通过编译。不能通过啊,不能通过。所以这个就是错误的。大家看看这方能理解吗?那如果同学们有所怀疑的话呢,你可以把这段代码放过来给大家测试一下,这个代码我就不测了,肯定是对的,对吧?我我给大家写一段代码。
05:07
相当于说这个练习吧,好不好,我把这一段代码呢,给大家写到一个文件夹里边去,我练习个1EXERCISE。Exercise,然后呢,我们写一个。命点够。没问题吧,同学们好,把它放去那放进去,放到这的话,我们是不是还得有一个包包啊?Package package package主函数。嗯,保存一下,我们可以看到此时此刻他确实报错了,再看这里。那这个地方不应该是这种错误啊。这是这里面有有些特别的编码。好把这个错误。处理一下。把这个不需要的乱七八糟的字符给它清一下就完了,好吧,这个也不难。OK,你。
06:00
Function。这地方亲一下啊,亲一下。好,那我现在再保存一下,大家看就不会刚才的错误了,它会保一个什么错误呢?大家看这里。说的很清楚,Delic就说重复定义的方法什么呀?他说你重复的方法叫test,零一就说他认为你这个C接口里面有两个test的意义,所以说他报的错误是重复定义。理解啊,重复定义,呃,这方我们在写编译,通过汇报什么呢?报告报重复定义。重复定义,OK。这个第二这个题我就讲完哈,再看第三个题。大家看这段代码有没有错误,为什么?我们来一起看一看,首先呢?它这有定义一个接口叫USB,这个接口里面有个方法C,好没问题,这有个结构体student,然后大家看到这里有点问题啊,大家看这里它呢,实现这个C方法,这个C方法它是用什么来实现的,它是用这个指针类型来实现的,注意它是用student这个结构体的指针类型来实现的,并不是student类型。
07:09
我们知道加一个星号和不加这个星号是有区别的。如果你加了星号,就代表是这个类型的指针类型,如果不加信号才是这个结构体类型,能理解。好,紧接着呢,他创建了一个student这么一个变,呃,这个结构体变量,然后把这个student付给这个U。大家觉得行吗?大家想一想,此时此刻这个student是什么类型?是不是他就是。Sto这个类型。而student这个类型并没有实现这个C方法,是不是因此可以告诉大家这个地方一定会报错?也就是说这个地方会错误。这又是错误。信不信这方一定会给你报错?因为他会告诉你,他会直接告诉你sto没有实现。
08:04
USBUSB这个接口来我们试一下,它会报什么呢?我可以告诉大家啊,汇报。汇报什么呢?汇报就是这个ST。他会说这这个啊,他会说STU这个类型没有。那些没有实现什么呢?USB接口。好,我们来试一下,是不是跟老师分析的一样呢?不知道是吧,我们试一下就知道。那这段代码我先把它删掉了啊,因为呃,也没什么实际的用处,删掉就完了,大家看。这个时候他直接,诶怎么是不会又是又是啊,你看这个没有写啊。Import下。Import。Format宝宝。写一个,大家看这里。看这里是不是已经报错了,看直接告诉你,他说cannot use to这个类型,为什么呢?他说s to这种类型,Does not implement没有实现USB这个接口里面的什么呀。
09:02
这个这个呃,C方法,他说他他这样说的啊,他说c method hands pointer receiver啊,他说他他直接告诉你应该给他传什么类型的,他就告诉你应该怎么改了啊,那你觉得应该怎么改就成功了。其实加个地址就成功了。为什么呢?因为这个USB接口它是这个指针实现的,所以你传个指针进去就行,其他调用没有没有变化还是一样的啊,因为你这个指针按理说它掉的时候呢,它是呃,它是这样调也是可以的,对吧,它这样是调是可以的。呃,因为你本身就是指针去实现这个C方法嘛,我直接叫他没毛病好,那运行出来这个结果也会是正确的跑一个。对吧,跑一个诶。CD。CD.ce对不对?老go run main.go跑起来这效果。是吧,还是正确的吧,是正确的,OK,那就是说这个地方应该怎么改,我把它写一下啊,这个地方是写的错误的,应该怎么修改呢。
10:03
我把这句话一起写到这儿。好,应该怎么修改呢?应该这样修改,可以这样修改啊。将如果如果修改成这个就可以了。如果希望通过通过编译,那应该怎么修改呢?把这个往下拉一下。如果希望通过编译,那么代码应该改成这个东西。就是这样写的。把这个加个地址就可以了。OK,好,这是我们这个题的评讲,好,我一共给大家讲了几个题呢?讲了这么。三个题我们把它整理一下啊,我们后面还有一个最佳实践,最佳实践的时候还会用这个接口啊,让大家进一步体验,因为接口太重要了,好吧。这有个课堂练习,课堂练习。把它整理到我们的笔记里边去。呃,课堂练习呢,一共有三个,我分别的给大家整理一下。
11:02
好,这是我们的第一个题,对吧,这个题是OK的编译,通过我整理一下是OK。这个是这个是通过啊OK。没问题。这第一个题是正确的。那么看第二个题,第二个题呢,老师已经把它评讲了。就是我已经告诉你,他这个地方哪个错了。这个题呢,它的错误原因我也分析了,是什么呀,这里有编译错误,因为这个C接口里面有两个test的离异方法,编译器不能通过重复报告重复定义明白。好,我把它也整一到,这是我们第二个题,第三个题,第三个题呢,我们也做了一个评价,好,我直接从这好吧。第三个题。好,这个地方会报错。我们写到这JM处以错误。这是错的。啊,错误。错误的写法,错误的写法。
12:00
应该改成。应该应该改成什么写法呢?应该改成这种写法,就是VRU。USB等于。艾符号s to,因为原因是我我就不用再多说了,因为你本身这个这个实现这个实现我们这个USB接口是人家是16指针类型实现的,对吧,并不是你10STUDENT这个类型实现的,加信号和不加信号是有区别的。来,我把这个呢,放到我们笔记里边去,没问题吧。好,那关于我们这个接口的课堂练习题呢,老师就评讲到这里,大家消化一下啊,消化一下,自己去想一想。
我来说两句