2371647917780_.pic.jpg
類與類直接的關系
- Extend 繼承
- Extension 包含
- With 使用
extends是繼承可以繼承父類的特性颖低。
- Dart中繼承是單繼承.
- 構造函數(shù)或者析構函數(shù)不能繼承.
- 子類重寫父類方法要在方法前加@override.
- 子類調用父類的方法用super.
- Dart中子類可以訪問父類的所有變量和方法.
mixin可以不通過繼承獲得一個類的能力類似組合
- 通過混入mixins的方式,可以把一個類的方法或者屬性混入到另外一個類中,供其使用.
接口與實現(xiàn) (implements)
- 實現(xiàn)某個接口,接口中的所有方法和成員變量必須都進行實現(xiàn).
擴展 (extension)
- 在Dart 2.7 版本中,Dart新加入了一個重要的語法功能弧烤,叫做extension忱屑。Extension的主要功能給已經(jīng)存在的類添加新的member function,往里面增加新的函數(shù)暇昂。通過extension, 我們可以向諸如 Iterable, String 這樣的常用類里面增加一些方便的函數(shù)莺戒。
使用場景一覽
關鍵字 | 解決什么問題 | 使用場景 | 限制 |
---|---|---|---|
Extend | 子類繼承 | 子類繼承父類 | 可以有構造方法和實例變量 |
Mixin(with) | 實現(xiàn)類似多繼承 | 不通過繼承獲得一個類的能力 | 不能有構造方法,可以有實例變量 |
Extension(on) | 給系統(tǒng)類【例如String類添加功能】 | 在無法修改被擴展類源碼的情況下 | 不能有構造方法和實例變量 |
Implement | 聲明和實現(xiàn)的解耦 | 模版方法的實現(xiàn)【設計模式的一種】 | 暫無 |
一次性看懂使用場景
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,都不可以添加構造函數(shù)泣懊,可以添加實例變量
class MyClassB {
String classBName = "classBName";
void doMyClassB() {
print('MyClassB.doMyClassB');
}
}
///implements來實現(xiàn)抽象類
class MyClassC implements ClassBase{
void doMyClassC() {
print('MyClassC.doMyClassC');
}
@override
void doAction() {
print('MyClassC.doAction');
}
}
///extends來繼承并實現(xiàn)抽象類
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】實現(xiàn)多繼承
///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實現(xiàn)類似多繼承的特性信夫,調用多個"子類"的方法
doMyClassA();
doMyClassB();
doMyClassC();
doMyClassD();
doMyClassE();
///調用extension擴展方法
doMyClassExtension();
///調用抽象類 模版方法 【implement和extend實現(xiàn)】
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