类与继承
Dart 中类和java 相似,都是用class定义,抽象类用abstract 标识,抽象类中可以包含已经实现的方法,也可以包含未实现的方法,
与java不同的是,抽象方法不需要abstract 抽象类的关键字,只需要该方法未实现即可
继承也与java的功能相似,用extends 定义 ,子类可以继承父类的方法,如果想要修改可以重写.
例子

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

BClass 继承了 Base 并重写了 a(),b(),c()方法,实现了Base类未实现的方法d();
接口
Dart 中其实并没有接口的概念,任何class 都可以作为接口被其他类实现,这里面有一个比较有意思的地方,
AClass 中已实现的方法,当AClass 作为接口被EClass实现的的时候, EClass无法调用AClass中已经实现的方法,即super.method();这个不能用,感觉这个概念和java类似,java是在接口中压根就没有实现,所以掉用不了,dart中虽然实现了,但是调用不了

也就是说作为接口被实现的时候,他所实现的方法不能被实现他的类调用,而且EClass 中必须重写所有AClass方法
所以感觉在实际开发过程中,如果一个类想要当做接口被实现,利用 抽象类 定义抽象方法,用这个抽象类作为接口被实现应该是最好的解决方法了
mixins
mixins 混入, 这个是dart新引入的概念, 他的写法是
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的其他类,也就是无法继承其他类,否则报错,
例子



这个是简写

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

结果

分析一下为什么结果会是这样,
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()方法都是只有一个类中有,执行有这个方法的类就可以了
我学习flutter的整个过程都记录在里面了
https://www.jianshu.com/c/36554cb4c804
最后附上demo 地址
网友评论