1-mixin机制
1.1-前言
转载注明出处:https://juejin.im/post/5efbf499e51d4534b979050c
mixin机制并非dart独创,在其他前端语言中也有很广泛应用。但对于一个刚开始看Flutter源码的客户端开发来说,各种mixin直接劝退,不得不先恶补下mixin。
mixin首要特性就是实现函数复用,所以在开始mixin机制解析前,先从第一个问题出发:
- 怎么实现函数的复用?
对应面向对象语言来说,通常的做法就是继承,即在基类中实现某个函数,子类继承该基类就可使用函数了。举个例子:狗和鹰都可以移动,通过在基类Animal中实现moveTo方法,Dog和Eagle继承后都能使用moveTo方法了
class Animal {
void moveTo(){
...//Do some thing}
}
class Dog extends Animal{
}
class Eagle extends Animal{
}
但通过继承的方式实现函数复用会有另外一个问题。即函数是与基类耦合的,子类继承了基类后就继承了基类的所有方法和属性。如果汽车要复用moveTo方法的话显然继承Animal是不合适的,由此引申出问题2:
- 怎么才能只复用Animal的moveTo方法而不继承其他方法和属性?
首先肯定要把moveTo方法从Animal中解耦出来,定义一个接口CommonBehavior来实现。在java8及Kotlin的接口支持函数的默认实现,java8需要default关键字。kotlin接口定义的方法同样支持默认实现,不过为了兼容java之前的版本,采用的是编译时生成一个静态类,通过调用静态类的静态方法moveTo方法来实现。
interface CommonBehavior {
defalut void moveTo(){
...//Do some Thing}
}
class Dog implements CommonBehavior{
}
此外Koltin还可以通过类委托来实现方法复用。除了接口外,还需声明一个moveTo具体实现的委托类BehaviorDelegate。
interface CommonBehavior {
fun moveTo()
}
class BehaviorDelegate : CommonBehavior {
override fun moveTo(){
...//Do some thing}
}
class Dog : CommonBehavior by BehaviorDelegate()
Kotlin类委托机制就不再详述了,原理是通过代理实现。Java当然也是可以通过代理实现的,不过没有by这种语法糖用起来爽。转到正题:
- 在Dart中怎么去实现代码复用呢?
Dart中没有interface关键字,而是用mixin进行混合,将moveTo抽离到一个mixin修饰的CommonBehavior。这样就能通过混入CommonBehavior直接使用moveTo方法了。
class Animal{}
mixin CommonBehavior{
moveTo(){...//Do some thing};
}
class Dog extends Animal with CommonBehavior {}
1.2-mixin特性
实现代码复用只是mixin的基本功能,mixin还有其