在 Dart 語言中,是不支持多繼承的,這是由語言設(shè)計決定的陈惰。但是 Flutter 提供了一種類似多繼承的方式,即使用 Mixin毕籽。
Mixin 是一種在類中重用一個或多個類中代碼的方式抬闯。在 Flutter 中,我們可以使用 Mixin 來組合多個類的功能关筒,從而實現(xiàn)類似多繼承的效果溶握。
class (普通類)
abstract class 類(抽象類)
mixin類(混入類)
mixin類,與abstract class有些通用的地方蒸播,可以理解為abstract class的升級版睡榆。
- 它相對于abstract class說,可以同時混入多個Mixin袍榆。
- 并且可以通過on關(guān)鍵字來限制使用范圍胀屿。
1、三種類:
class 普通類 (成員方法必須要實現(xiàn))
聲明一個類包雀,提供具體的成員變量和方法實現(xiàn)宿崭。abstract class 抽象類 (定義抽象方法)
聲明一個抽象類,抽象類將無法被實例化才写。抽象類常用于聲明接口方法葡兑、有時也會有具體的方法實現(xiàn)。mixin 混入類(不能有構(gòu)造方法)
聲明一個Mixin類赞草,與抽象類一樣無法被實例化铁孵,是一種在多重繼承中復(fù)用某個類中代碼的方法模式,可以聲明接口方法或有具體的方法實現(xiàn)房资。
mix不支持extends繼承和with混入 其他類√赐罚可以implements實現(xiàn)其他類轰异。
參考:https://juejin.cn/post/7094642592880525320
2、繼承暑始、混入搭独、實現(xiàn)、約束廊镜, 4個關(guān)鍵字:
1牙肝、extends 繼承
繼承,和其它語言的繼承沒什么區(qū)別。2配椭、with 多繼承(父類不能有構(gòu)造方法)
使用Mixin模式混入一個或者多個Mixin類虫溜。
特點:
mixin類确封,可以with (混入)類香缺,抽象類(這里的類和抽象需要:無任何繼承和混入的類)、 mixin類盹憎。支持on
mixin類不能混入和繼承其他類敦姻。
- 在面向?qū)ο蟮木幊陶Z言中瘾境,Mixin是包含供其他類使用的方法的類,而不必是其他類的父類镰惦。其他類如何訪問Mixin的方法取決于語言迷守。Mixin有時被描述為“包含的”而不是“繼承的”。
Mixins鼓勵代碼重用旺入,并且可用于避免多重繼承可能導(dǎo)致的繼承歧義(菱形問題)兑凿,或者用于解決語言中缺少對多重繼承的支持的問題。Mixin還可以被視為具有實現(xiàn)方法的接口眨业。這個模式是執(zhí)行依賴倒置原則的一個例子急膀。- c++棱形繼承和解決方法.棱形繼承,數(shù)據(jù)榮譽問題https://blog.csdn.net/m0_60447315/article/details/125929140
- 繼承歧義龄捡,也叫菱形問題卓嫂,也叫做鉆石問題,或者有時被稱為致命的死亡鉆石聘殖。當(dāng)兩個B和C類繼承自A晨雳,D類繼承自B和C時產(chǎn)生歧義。如果A中有一個方法在B和C中已經(jīng)重寫奸腺,而D沒有重寫它餐禁,那么D繼承的方法的版本是B,還是C突照?
https://cloud.tencent.com/developer/article/1381007
pv64ku21r7.png
3帮非、implements 繼承(父類方法必須要實現(xiàn))
實現(xiàn)一個或多個接口并實現(xiàn)每個接口定義的API。4讹蘑、on 約束(繼承mixin類的類末盔,必須同時繼承約束類)
限制Mixin的使用范圍。
- 每一個類都隱式地定義了一個接口并實現(xiàn)了該接口座慰,這個接口包含所有這個類的成員變量以及這個類所實現(xiàn)的其它接口陨舱。
- 如果想讓抽象類同時可被實例化,可以為其定義
工廠構(gòu)造函數(shù)
版仔。具體內(nèi)容可以參考:抽象類的實例化*mixin
關(guān)鍵字在Dart 2.1
中才被引用支持游盲。早期版本中的代碼通常使用abstract class
代替
3误墓、代碼實例
mixin ClassA {
//專門定義為混入類
method1();
}
abstract class ClassA2 {
method2(); //如果沒有加abstract,不是抽象類益缎。方法必須要實現(xiàn)
}
class ClassA4 {}
mixin ClassA3 on ClassA4 {
//添加約束谜慌,繼承ClassA3的類,也必須繼承成ClassA4
method3();
}
class ClassA5 {
method4() {
print("12");
}
}
class ClassC implements ClassA5 {
//implements必須要實現(xiàn)父類方法
method4() {
print("12");
}
}
class ClassD extends ClassA5 {
//
}
class ClassB extends ClassA5 with ClassA4, ClassA, ClassA2, ClassA3 {
//with后面可以接抽象類, ClassA4必須要放在ClassA3前面
//多繼承的方法一定要實現(xiàn)
method1() {
print("12");
}
//with后面的抽象類链峭,方法也一定要實現(xiàn)
method2() {
print("12");
}
method3() {
print("12");
}
}
void main() {
var b = ClassB();
b.method1();
}