https://medium.com/flutter-community/https-medium-com-shubhamhackzz-dart-for-flutter-mixins-in-dart-f8bb10a3d341
https://github.com/dart-lang/language/blob/master/accepted/2.1/super-mixins/feature-specification.md#dart-2-mixin-declarations
mixin是一种多继承的实现方式。
java中,不支持多继承。是这样吗?Java 8开始,允许在interface中提供方法的默认实现,如果我们的类实现了多个interface,就自动的从这些interface继承了API,以及行为:API的默认实现。除了语法和C++的多继承有些区别外,这和多继承其实就是一回事。
dart中,使用mixin的概念来实现多继承。
mixin是有序的
当一个类利用with混入多个mixin时,顺序很重要。在不同的mixin中,可以定义同名的方法,或者override同一个方法,此时在某个mixin中,或者说在类自身中,调用这样的同名方法,究竟调用的是哪个方法呢?
可以将mixin想象成创建一个新类,这个新类是由mixin定义的,并且继承自基类,按照mixin出现的顺序,依次创建出新类,就是我们最终得到的,经过mixin的类。这样上面的问题就容易解答了:
- 当在类自身中调用某个同名方法时,实际上调用的是最终合成的类中的方法,也就是调用了最后一个override了该方法的mixin;
- 当在mixin中调用super同名方法时,实际上是调用了在截止到它为止合成的类的super方法,也就是说,如果我们有class Test with A, B, C,并且在B中通过super调用了某个方法,首先dart会从A里面找该方法调用,如果没有就去Test找。
mixin可以指定哪些类允许mixin它
dart 2.1优化了mixin语法,引入了on关键字,允许mixin定义时指定哪些类可以混入该mixin,这样可以有更合理的静态语法检查:当我们调用super方法时,dart能够检查on指定的类中是否存在该方法。只有继承自on指定的类的类才能够混入该mixin。
没有用mixin声明的类也可以被mixin
使用with,还可以mixin其他没有在定义时使用mixin来定义的类,包括abstract class、或者普通class,只要它们没有定义构造函数,并且直接继承自Object(也就是没有继承任何父类),就可以被mixin。这样可以立刻复用mixin的类的所有属性和方法。在Java中,当我们有这样的需求时,一般是通过Proxy模式实现的,而当我们有很多这样的需求时,Proxy模式写起来、看起来非常难受。相比之下,mixin会更加方便。