Flutter 学习之旅02-类、接口和继承以及mixins


类与继承

Dart 中类和java 相似,都是用class定义,抽象类用abstract 标识,抽象类中可以包含已经实现的方法,也可以包含未实现的方法,

与java不同的是,抽象方法不需要abstract 抽象类的关键字,只需要该方法未实现即可

继承也与java的功能相似,用extends 定义 ,子类可以继承父类的方法,如果想要修改可以重写.

例子

img

Base抽象类中包含了三个已经实现的方法,和一个未实现的抽象方法,

img

BClass 继承了 Base 并重写了 a(),b(),c()方法,实现了Base类未实现的方法d();

接口

Dart 中其实并没有接口的概念,任何class 都可以作为接口被其他类实现,这里面有一个比较有意思的地方,

AClass 中已实现的方法,当AClass 作为接口被EClass实现的的时候, EClass无法调用AClass中已经实现的方法,即super.method();这个不能用,感觉这个概念和java类似,java是在接口中压根就没有实现,所以掉用不了,dart中虽然实现了,但是调用不了

img

也就是说作为接口被实现的时候,他所实现的方法不能被实现他的类调用,而且EClass 中必须重写所有AClass方法

所以感觉在实际开发过程中,如果一个类想要当做接口被实现,利用抽象类定义抽象方法,用这个抽象类作为接口被实现应该是最好的解决方法了

mixins

mixins 混入, 这个是dart新引入的概念, 他的写法是

1
2
3
class cls extends cls1 with cls2,cls3{

}

如果cls1与 cls2和cls3中存在相同命名的方法,他的基础执行顺序是从右到左依次执行,

我们还是以上面 Base AClass BClass 为例 ,为了更好的区分,我们再引入另一个类AClass2 他有了 a()方法和g()方法, AClass 实现了 a(),b() 两个方法 ,Base 中 有a(),b(),c(),d() 四个方法

其中a()方法为所有类中都包含的方法,如果想要执行谁的a()方法,按照右到左的顺序执行,哪个类的排名应该在最后,

而且已with 为关键字所指向的类,不能含有构造方法,不能继承除了Object的其他类,也就是无法继承其他类,否则报错,

例子

img

img

img

​ 这个是简写

img

这个是完整的写法

如果某个类想要简写,就必须除了拼装他所需要的类,不能再含有其他属性,

img

结果

img

分析一下为什么结果会是这样,

class CClass = BClass with AClass,AClass2;

a():这个方法是所有混入的类中共有的方法,按照从右到左的有效顺序,a()方式应该选择ACass2的方法,所有打印的日志为 AClass2 a();

b():这个方法为AClass 与Base 方法共有的方法,按照从右到左的顺序,应该执行AClass 中的b(),所有打印的是AClass b();

c():这个方法为BClass类中的方法,所以执行BClass中的方法,先执行 super.c(),在执行 BClass.c()方法

d();与g()方法都是只有一个类中有,执行有这个方法的类就可以了