在 Dart 语言中,是不支持多继承的,这是由语言设计决定的。但是 Flutter 提供了一种类似多继承的方式,即使用 Mixin。
Mixin 是一种在类中重用一个或多个类中代码的方式。在 Flutter 中,我们可以使用 Mixin 来组合多个类的功能,从而实现类似多继承的效果。
class (普通类)
abstract class 类(抽象类)
mixin类(混入类)
mixin类,与abstract class有些通用的地方,可以理解为abstract class的升级版。
- 它相对于abstract class说,可以同时混入多个Mixin。
- 并且可以通过on关键字来限制使用范围。
1、三种类:
class 普通类 (成员方法必须要实现)
声明一个类,提供具体的成员变量和方法实现。abstract class 抽象类 (定义抽象方法)
声明一个抽象类,抽象类将无法被实例化。抽象类常用于声明接口方法、有时也会有具体的方法实现。mixin 混入类(不能有构造方法)
声明一个Mixin类,与抽象类一样无法被实例化,是一种在多重继承中复用某个类中代码的方法模式,可以声明接口方法或有具体的方法实现。
mix不支持extends继承和with混入 其他类。可以implements实现其他类。
参考:https://juejin.cn/post/7094642592880525320
2、继承、混入、实现、约束, 4个关键字:
1、extends 继承
继承,和其它语言的继承没什么区别。2、with 多继承(父类不能有构造方法)
使用Mixin模式混入一个或者多个Mixin类。
特点:
mixin类,可以with (混入)类,抽象类(这里的类和抽象需要:无任何继承和混入的类)、 mixin类。支持on
mixin类不能混入和继承其他类。
- 在面向对象的编程语言中,Mixin是包含供其他类使用的方法的类,而不必是其他类的父类。其他类如何访问Mixin的方法取决于语言。Mixin有时被描述为“包含的”而不是“继承的”。
Mixins鼓励代码重用,并且可用于避免多重继承可能导致的继承歧义(菱形问题),或者用于解决语言中缺少对多重继承的支持的问题。Mixin还可以被视为具有实现方法的接口。这个模式是执行依赖倒置原则的一个例子。- c++棱形继承和解决方法.棱形继承,数据荣誉问题https://blog.csdn.net/m0_60447315/article/details/125929140
- 继承歧义,也叫菱形问题,也叫做钻石问题,或者有时被称为致命的死亡钻石。当两个B和C类继承自A,D类继承自B和C时产生歧义。如果A中有一个方法在B和C中已经重写,而D没有重写它,那么D继承的方法的版本是B,还是C?
https://cloud.tencent.com/developer/article/1381007
pv64ku21r7.png
3、implements 继承(父类方法必须要实现)
实现一个或多个接口并实现每个接口定义的API。4、on 约束(继承mixin类的类,必须同时继承约束类)
限制Mixin的使用范围。
- 每一个类都隐式地定义了一个接口并实现了该接口,这个接口包含所有这个类的成员变量以及这个类所实现的其它接口。
- 如果想让抽象类同时可被实例化,可以为其定义
工厂构造函数
。具体内容可以参考:抽象类的实例化*mixin
关键字在Dart 2.1
中才被引用支持。早期版本中的代码通常使用abstract class
代替
3、代码实例
mixin ClassA {
//专门定义为混入类
method1();
}
abstract class ClassA2 {
method2(); //如果没有加abstract,不是抽象类。方法必须要实现
}
class ClassA4 {}
mixin ClassA3 on ClassA4 {
//添加约束,继承ClassA3的类,也必须继承成ClassA4
method3();
}
class ClassA5 {
method4() {
print("12");
}
}
class ClassC implements ClassA5 {
//implements必须要实现父类方法
method4() {
print("12");
}
}
class ClassD extends ClassA5 {
//
}
class ClassB extends ClassA5 with ClassA4, ClassA, ClassA2, ClassA3 {
//with后面可以接抽象类, ClassA4必须要放在ClassA3前面
//多继承的方法一定要实现
method1() {
print("12");
}
//with后面的抽象类,方法也一定要实现
method2() {
print("12");
}
method3() {
print("12");
}
}
void main() {
var b = ClassB();
b.method1();
}