extends是继承可以继承父类的特性。
- Dart中继承是单继承.
- 构造函数或者析构函数不能继承.
- 子类重写父类方法要在方法前加@override.
- 子类调用父类的方法用super.
- Dart中子类可以访问父类的所有变量和方法.
mixin可以不通过继承获得一个类的能力类似组合
- 通过混入mixins的方式,可以把一个类的方法或者属性混入到另外一个类中,供其使用.
接口与实现 (implements)
- 实现某个接口,接口中的所有方法和成员变量必须都进行实现.
扩展 (extension)
- 在Dart 2.7 版本中,Dart新加入了一个重要的语法功能,叫做extension。Extension的主要功能给已经存在的类添加新的member function,往里面增加新的函数。通过extension, 我们可以向诸如 Iterable, String 这样的常用类里面增加一些方便的函数。
使用场景一览
关键字 |
解决什么问题 |
使用场景 |
限制 |
Extend |
子类继承 |
子类继承父类 |
可以有构造方法和实例变量 |
Mixin(with) |
实现类似多继承 |
不通过继承获得一个类的能力 |
不能有构造方法,可以有实例变量 |
Extension(on) |
给系统类【例如String类添加功能】 |
在无法修改被扩展类源码的情况下 |
不能有构造方法和实例变量 |
Implement |
声明和实现的解耦 |
模版方法的实现【设计模式的一种】 |
暂无 |
一次性看懂使用场景
abstract class ClassBase{
void doAction();
}
class MyClassA {
String name;
String age;
MyClassA(this.name, this.age);
void doMyClassA() {
print('MyClassA.doMyClassA name:$name age:$age');
}
}
///下面的MyClassB、MyClassC、MyClassD、MyClassE,不管用class还是mixin修饰,
///本质上都是mixin,都不可以添加构造函数,可以添加实例变量
class MyClassB {
String classBName = "classBName";
void doMyClassB() {
print('MyClassB.doMyClassB');
}
}
///implements来实现抽象类
class MyClassC implements ClassBase{
void doMyClassC() {
print('MyClassC.doMyClassC');
}
@override
void doAction() {
print('MyClassC.doAction');
}
}
///extends来继承并实现抽象类
class MyClassD extends ClassBase{
void doMyClassD() {
print('MyClassD.doMyClassD');
}
@override
void doAction() {
print('MyClassD.doAction');
}
}
mixin MyClassE implements ClassBase{
void doMyClassE() {
print('MyClassA.doMyClassE');
}
}
///extension 无需修改MyClass 的源码,就可以给MyClass 添加功能
extension MyClassExtension on MyClass{
// 不能添加实例变量,Extensions can't declare instance fields
// String extensionName = "";
void doMyClassExtension(){
print('doMyClassExtension');
}
}
///Dart 语言支持多继承【extends,with】实现多继承
///The class 'MyClassA' can't be used as a mixin because it declares a constructor.
///class MyClass extends MyClassB with MyClassA, MyClassC, MyClassD, MyClassE
class MyClass extends MyClassA with MyClassB, MyClassC, MyClassD, MyClassE {
MyClass(String name, String age) : super(name, age);
///父类重写子类的方法
@override
void doMyClassE() {
// TODO: implement doMyClassE
super.doMyClassE();
print('Rewrite MyClass.doMyClassE Method');
}
@override
void myClassDoAction() {
///通过mixin with实现类似多继承的特性,调用多个"子类"的方法
doMyClassA();
doMyClassB();
doMyClassC();
doMyClassD();
doMyClassE();
///调用extension扩展方法
doMyClassExtension();
///调用抽象类 模版方法 【implement和extend实现】
doAction();
}
}
MyClass("Neo", "22").myClassDoAction();
flutter: MyClassA.doMyClassA name:Neo age:22
flutter: MyClassB.doMyClassB
flutter: MyClassC.doMyClassC
flutter: MyClassD.doMyClassD
flutter: MyClassA.doMyClassE
flutter: Rewrite MyClass.doMyClassE Method
flutter: doMyClassExtension
flutter: MyClassD.doAction