前置知识点: 1 在 dart 3.0之前,class是可以直接被with,3.0之后,只有mixin修饰的类可以被with。
第一种情况 被with的类没有共同的基类
mixin class B {
void parentMethod(){
print('B_Method');
}
}
mixin class C {
void parentMethod(){
print('C_Method');
}
}
class A with B , C{
void parentMethod(){
print('A_Method');
super.parentMethod();
}
}
void main() {
A().parentMethod();
}
上面的输出结果结果为:A_Method ,C_Method。 结论是:如果混入多个类,且多个类含有相同的方法,在子类中调用,会调用离的最远的类的方法。
第二种情况 被with的类有共同的基类
class Base {
void parentMethod(){
print('Base_Method');
}
}
mixin B on Base {
void parentMethod(){
print('B_Method');
super.parentMethod();
}
}
mixin C on Base {
void parentMethod(){
print('C_Method');
super.parentMethod();
}
}
class A extends Base with B , C{
void parentMethod(){
print('A_Method');
super.parentMethod();
}
}
void main() {
A().parentMethod();
}
输出结果
A_Method
C_Method
B_Method
Base_Method
结论:1 也是优先调用力的最远的类的方法 2 最后调用base的方法。 3 是通过调用super的方法一级一级传递的,如果哪一级不调用super,传递中断。