00:00
那么下面要给大家聊的一个话题呢?是在特质中重写抽象方法的一个特例,或者一个特殊的一个情况,需要同学们了解的。首先我们这样子,我们先抛出一个问题。大家先看这个问题会怎么样啊?同学们看看这里。首先呢,同学们。看这里我写了一个OPER5,这边有个抽象方法,这个大家应应该一看就明白了,然后呢,我用FIVE5去继承了OPERATEER5里面我写了一个方法,我实现一个方法,但是这个方法呢,很诡异,我写的我怎么写的呢?我写完这个iner方法过后。我又去调用了super insert ad。那这样子就这样子会出现一个什么情况呢?哎,你是一个你把人家的你你把父类的方法给相当于给实现了。完了,后来你又去调这个。复复特制的一个方法,它还没有呢,它是个抽象的,好这种呢,就是在我们这个重写抽象方法的一个特点,呃,如果我没有这句话,同学们,那肯定代码就是OK的,但是在有些情况下,你会看到有人在这里面写了一个叫super调用的一个方法,它这是什么含义呢?就是。
01:19
他这个跟他的特质,就是跟他特质混入有些关系,我们先来看看这个代码会出现一个什么问题,好吧。我们来执行一下,那现在呢,仍然是我们一个跟混入相关的,我直接写到这里,好,同学们,我新建一个包叫mixed mixed in demo02。不着急啊,我们都跟他说清楚,因为我现在不说,你将来再去写代码的时候,你迟早会来看这个基本语法,那干脆咱们都一次说完了,好,同学们可以看到这个代码从。从这个运行来说,语法没有任何问题,但是如果同学们稍稍动动脑筋,就知道这代码一定会错,为什么你想到这来,一旦调用我一旦调用的话,你你琢磨琢磨,一旦调用它会调查这个负类的书本,而这个书本。
02:09
里面那个是没有实现的。说这个易运行呢,你都不用讲,我什么都不写,编译性都会报错。这个错误呢,它在运行的时候会被暴露出来。啊,运行的时候标出,那么我们看他会干什么呢?一运行我们发现他报了一个错误,这个错误大概是这样子的,他说他说method insert in trade operator5。Is accessed from,他从这个忽略过来的,他说什么呢?他说it maybe it not be。而不拽,他说他说你可能不是一个抽象的,那你要怎么改呢?除非他说你加上看这啊,他说你要你要让它运行起来,你必须要加上这么一个关键字什么呢?首先是一个抽象的,而且还加个override。那怎么理解这句话呢?这个编析其实就是告诉我们这么一个特性,说你有一个方法,在这个子特征里面有个方法,你重写了忽略方法,但是重写完了过后呢,仍然是一个抽象方法,明白这意思吧,所以说这针对这个问题,我们的解决方法其实是这样子。
03:14
那当然有同学说,老师你这样写干什么呢?这样写待会儿你就知道它有什么一个用处了啊,它的提示信息同学们刚才已经看到了,我们应该这样写。应该这样加一个abstract。Override。这个代码就不会再报错了。我们在运行。我们再次运行呢,我们可以看到这个代码就OK了。OK了,那为什么呢?好,我解释一下这个意思,注意听啊,我说明一下。啊,如果我们在子特质,在子特质中重写了,或者实现了都可以啊,或者叫实现了。实现了一个负特质的负特质啊,负特质的抽象方法,抽象。
04:03
抽象方法,但是又调用了,但是同时又调用了,调用了super方法,那这个时候应该怎么理解呢?这时这个方法就是你只这这时我们的这个,呃,这个重写的重写这个这个方法不是完全实现了,不是完全实现了,因此。因此需要声明为需要声明,为什么呢?声明为这个,诶声明啊,声明为这个abstract override。这就相当于说,我确确实实好像想去重写,或者想去实现,但是呢,完了过后我还是个抽象的。那那就意味着我一旦写了过后,就意味就意味着调用者要注意一个问题,调用者要注意什么问题呢?你还得去实现这个方法,不然的话仍然不能用,比如说大家看我再写一个,我测试一下啊,叫做TEMP06,我谁呢five。
05:08
啊five,诶同学们可以看到这样five过后呢。诶,这人还没报错是吧。啊先那那待会再说这个细节啊,待会再说应该他也这个地方,它是它是干什么的呢?我先说它的作用是什么啊,同学们肯定很关心它的作用,就是你这样写它有什么用呢。它有什么用呢?这个这个super仍然是可以用的,注意听啊,这个super不是说不能用,这个super不是不能用,这时注意听,这时。我们这个super insert就跟我们的动态混入的顺序有密切的关系,也就是说我们这个原先我们讲到东在super的时候,它不一定指的是雷,大家看你你如果说这个地方加入过这个super。因为它在动态混入时不一定指的就是负类的,那如果说刚好我们混入的时候,这个书指的是我左边那个特制的绿色,这个代码就能够正常运行,它其实就是干这个事情的好,那么这是superer呢,就的调用的调用。
06:15
的调用就和就和什么呢?就和我们动态混入的顺序,顺序有密切的关系,有密切的关系,密切啊密切的关系。密切关系好啊苏老师,那这个关系说老师为什么说这个事儿呢?因为有时候你们在看源码的时候,人家就这么用,你会觉得很奇怪,诶这个写法怎么这么怪呢?他掉书本抽书本之后抽象那没法用啊,但是实际代码不一定不能用。为什么呢?因为我们前面讲那个动态混入的,我讲一个顺序,它在调的时候,它不一定这个super就是类的,它可能是指的它的动态混入的左边的一个副特是一个竖盘,那这个代码仍然可以正常正常运行。
07:01
其实他的作用就干这事。就是说他觉得这个说他为什么这样呢?他觉他觉得这个负类这个这个算没有必要实现。好,我们不管怎么样,我们来玩一把,现在把这个说完了,我们来看代码,说老师,那你给我们演示一下它的使用,好没有任何问题,我现在呢,来探讨这个话题啊。刚才我们这个代码是出错的,刚才这个代码肯定是要出错的,就是你没有加任何东西,这个代码肯定错。对吧,错误的原因就是错误,错误的原因原因就是没有完全的完全的实现这个这个insert方法,同时你也没有声明层对吧,同时同时你也还没有还没有声明什么呢?Obstract什么呢?这个overright,所以它错了,那解决方法第一个方案。把书牌拿掉,那肯定没有意义,本身就想干这个事,你把它拿掉,你把它拿掉不就相当于说去按照正常流程去实现一个抽销方法吗?第二个方法是我要讲的第二方法是这样子的啊。
08:04
这时第二个方法在我们也能用这个书,但是在调用负特制的抽象方法时,那么在实际使用时没有方法的具体实现,无法通过编译。为了避免这个情况,可以重写抽象方法。什么叫重写抽象方法?这个重写抽象方法指的就是加入。这两个就相当于说我这个方法是重写的一个抽象方法啊,我就重写抽象方法,但我仍然还是个抽象的,然后呢,这时我们在使用时必须动态考入顺序,好,同学们,我们快速的给大家演示一个案例。好,来,呃,我们呢,把这段代码拿过来为我所用,好,同学们看这一个operate five5了啊,我现在呢,为了演示我迅速的再写一个小案例,我就直接这样用。同学们看,我把这个再拿过来一个啊,因为这个案例呢,我我不会再重新去把这个再写一遍,没有没有意义啊,好,大家看我这里这怎么变这个就行了啊,稍微的整理一下,不好意思,稍微整理一下,这边可能是我的格式整理的不到位。
09:08
好,同学们看我的代码难道就跑不起了人炮我们看这边这里我们我们继承了,继承了op,而且是实实在在的去实现了oper的方法,就是它是真的实现了啊并。并并实现了,实现了谁呢?哎,它实现了OPERATE5的UR好的的UR好,同学们大家这个应该很好理解,好完了过后我现在混入了啊说老师你你能用了吗?可以用,那现在呢,我们再来写一个class my。MY c5看代码就是一个普通类,现在开始混入,大家看我这样用行不行,好,我把这个稍微放大一点啊,放大一点,好朋友们我们来玩一把,我另一个my circle,哎,我的五声二在这。啊with啊with,我干什么呢?我先混入DB5。
10:06
我先混入DD,然后再接着混入fire。诶,同学们。好,现在呢,我搞一个对象出来,这个地方就是我们的myc写到这里。诶写到这边啊,各位同学,那这个时候这个时候我来调用一下MySQLser,好给它传入一个666。好朋友们,现在我们呃来分析一下这段代码运行起来有没有问题。有问题吗?大家感觉没有任何问题,你看啊,首先构建这个地方跟你这个方法没关系,因此不受任何影响,这个我就不去分析了,那么我在调用的时候,我调用反二五,我先找到反二五,哦,找到方二五,找到了,找到过呢,我仍然去行这个方法,虽然你是抽象的,仍然被执行了,所以这个就是它的一个重写,抽象方法一个特点,按理说你抽象肯定不能调用,但是它就能调用,然后传进去后,它首先输出这个一句话什么呢?它首先输出聊。
11:06
第一句话是这个,当他把这句话输出完了以后呢,他叫super,哎,这个时候super并不指的是operator。没有走二分,他直接奔第第五来了,于是他又执行这句话,执行这句话。啊,注意这错好诶,这两句话怎么一模一样呢?将数据保存文件,呃,不,不一样啊,不一样,这句话是将数据保存到数据库中就OK了。好,当他把这句话做完以后呢,下面他没有再叫竖牌了。这个终止了,终止了过后呢,代码就顺利的得到了执行,我们执行一下,请看代码。当我们执行完过后,我们发现代码没有任何的问题,跑的非常的顺畅。但是我刚才讲过一个特别重要的东西,就是这时我们在使用时必须考虑混入顺序,假如我把这个顺序颠倒一下,同学们代码就仍然会报错误,请看。
12:01
如果我这样写啊,我快速的来写一段代码,我把这个呢往这儿一拿,我写个下划线。好,然后呢,我把这个颠倒一下,我把DB5扔屁股后面去,对,然后把FIRE5扔到前面去。好同学们看到从这个编译来看,从这个编译来看呢,它好像并没有报错,那么我来点啊,这个点我INSERT1把给他传入一个传,传入一个六六。好,同学们可以看到这样一执行,我们会发现它会有问题,因为你这个DB5在混住的构建还是没有顺序,没有问题,构建仍然是正常执行,那么他一上来就执行这个DD5 DD5里面有一个。啊,他他一上来就执行这个DD5D5在哪呢。啊,那我那我这应该在我看是不是这DB5应该加了什么东西来进行测试啊。DB5。
13:01
哎,DB5我看看啊,DB我这没加东西啊。啊,我这样子啊,这样测试就完了,我我就不写那么多了啊啊不不混入多个,我就直接这样写一样把这个问题给他暴露出来就行了,我就直接混入一个范二五就行了,好吧,啊你看这直接就报错了,你看我上面我如果直接混入一个DB5,这个是这这个是可以了,对吧,但是我如果直接只混入一个FIRE5。那么这个就报错了,因为人家直接告诉你这个有一个问题没有得到。在它编译层面就给你控制住,为什么呢?因为如果这能通过的话,就是说你掉半二五到这来啊,你到这儿没没地方跑了,它就会因为你左边也没东西了嘛,他就去照自己的负类,负类这个抽象方法报错,好同学们把这个逻辑搞清楚就行了啊,OK,下面这个代码是错误的,好到时我们这个分析就完成了啊,就是下面下面的这个混入方式,混入方式是错误的。
14:04
好的。OK,好,那么这个原因刚才老师也做了说明,好到此呢,我们把这个叫做呃,重写,重写这个方法的特例,我们来做一个简单的整理,好来看一下。在特质中重写出现方法,如何理解all straight override的小技巧?这里可以这样理解,当我们给某个方法增加了offtra override过后,就明确的告诉编辑器,这个方法的确重写了副特质的抽象方法,但重写后该方法仍然是一个抽象法,因为没有完全的实现,需要其他特征继续实现。那么实现的时候呢,可以通过这个混入的顺序来搞定啊,通过混入顺序混入顺序搞定啊。当然有些同学可能说,老师这个混入到底是本质什么?混入仍然是产生一个新的对象,它产生个新的对象,它的内的关系呢?仍然是重新构建的。
15:01
明白这意思吧,所以他在地方他仍然会去做这个super的调用,那个时候他一检查书就应该是旁边那个,他就通过了,就这个逻辑。好,那么这样讲完了过后呢,我们再来看一下这个有这么几个练习题,我们把这个练习题走一下,我们看看同学们能够呃判断出来没有,就针对刚才这个题啊,就针对刚才这个题,我一共有四个题,我们看能不能通过,首先同学们请看第一个MY。MYSQL5混入一个DB5,这个能不能通过。可以的,诶刚才我们已经讲了,这个是OK的,因为。因为这个DD5,它它就是一个很很简单的一个实现这个可以的,好,我们看第二个,呃,MY5混入一个FIRE5,这个可不可以,这个是error的。错的啊,因为你到那super已经找不到东西了,好,那么我把这个FIRE5,我先混入DB5,再混入FIRE5,这个可不可以,这个是OK的啊,这个是OK的。
16:03
那么如果我把这个顺序颠倒,是不是也是直接报错了啊,这个也是错误的啊,哎,这个可不可以啊,那这个可不可以我们看看啊,如果如果我把这个顺序颠倒一下,看看这个可不可以,哎,这个没事,刚才。好看一下,这个时候如果可以的话,他会怎么样呢?不着急啊,同学们。好同学们,我们把这个加一个下划线,哎,这次呢,我就把它顺序颠倒一下,看看可不可以。好的,OK,把它换一下。换一下好,编译没有没有错误,呃,这个地方我下下划线,那么这个时候它会怎么执行呢?我们分析一把啊同学们,首先它找到DB5。找到一直行,诶没有书板就断掉了,那断掉就完了嘛,相当于说你相当于说我不再往上面去追这个方法了,对吧?好这个呢应该也是可以的,但是这个地方应该只输出了一句话,是不是他应该只输出了一句叫做将数据保存到数据库中就完事了。
17:04
而且也是可以的,但是呢,输出这个结果呢,只有一句话。OK,我们来执行一下,同学们走一个看代码。好,我们执行这个代码,你看行吗?你看是不是人人给我们报错了呀?你看他爆了什么东西,这爆了一堆洞。看不懂了。你看这个它是conflict。说说他仍然是不行。他人不行,不行的原因就是他在进行混珠的时候,Inherence就是个继承的一个。冲突。他认为这是冲突的啊,他认为你这样去调用就是冲突的,所以说这个地方呢,看起来从语法过,但仍然是错的,因此这个结论这个也是错的。好,最后我们方式指的是OKLL,好,大家理解一下这个原因啊,理解这个原因。啊。哪哪写错了。
18:02
哦对对对对对啊,这个这个是写反了是吧,这个是错的是吧?这个是错的,下面这个是对的,诶刚才我们是刚刚也是这样讲的啊,只是笔记写错了,好同学们,我们休息十分钟。
我来说两句