Dart中Class、mixin、interface三者間關系及異同
Class
Dart中一切皆為對象,而每個對象都是一個類的執行個體,所有的類都繼承于Object。
除了普通的構造方法,Dart中的Class還提供了不同用途的構造方法,比如命名構造方法、重定向構造方法、常量構造方法、工廠構造方法,還有初始化參數清單等。
抽象類
抽象類使用abstract關鍵字定義,是不能被執行個體化的,通常用來定義接口以及部分實作。
但與其他語言不太一樣的地方是,抽象方法也可以定義在非抽象類中。
Interface:
每個類的内部都隐式的定義了一個接口,這個接口包含類的成員的所有執行個體,以及類實作的所有接口。
如果你想讓A類支援B類所有的API,并且不通過繼承B類來實作,那麼A類應該實作B接口。
一個類可以實作一個或多個接口,通過implements關鍵字。
mixin
Dart語言集合了現代程式設計語言的衆多優點,Mixin繼承機制也是其一。具體的讀法應該叫做 mix in,翻譯下就是混入。
mixins
是一種實作多重繼承的方式,通過它可以給現有的類添加特性。
在
with
關鍵字後面可以跟随一個或多個
mixin
的名稱。如下所示:
class Musician extends Performer with Musical {
// ···
}
class Maestro extends Person
with Musical, Aggressive, Demented {
Maestro(String maestroName) {
name = maestroName;
canConduct = true;
}
}
想要實作一個mixin,你可以建立一個繼承自Object的、沒有構造器的類。
如果你不想讓mixin類可以當做普通class一樣使用的話,就是用mixin關鍵字替換class關鍵字。
換句話說,mixin也可以使用class關鍵字定義(也可以是抽象類),也可以當做普通class一樣使用。
mixin Musical {
bool canPlayPiano = false;
bool canCompose = false;
bool canConduct = false;
void entertainMe() {
if (canPlayPiano) {
print('Playing piano');
} else if (canConduct) {
print('Waving hands');
} else {
print('Humming to self');
}
}
}
使用
on
關鍵字可以指定mixin的父類,
mixin MusicalPerformer on Musician {
// ···
}
注意:對mixin關鍵字的支援是在Dart 2.1 版本引入的,早期的版本使用`abstract class`來代替的。
異同
mixin也可以使用class關鍵字定義,也可以當做普通class一樣使用。
mixin可以使用with定義,這樣定義的mixin就隻能通過with關鍵字引用了。
Dart是沒有interface這種東西的,但并不意味着這門語言沒有接口,事實上,Dart任何一個類都是接口,你可以實作任何一個類,隻需要重寫那個類裡面的所有具體方法。
是以說,一個普通類class,即是普通類,也是接口,也可以當做mixin來使用。
參考:
https://www.dartlang.org/guides/language/language-tour#classes
Flutter基礎:了解Dart的Mixin繼承機制
Mixin是什麼概念?——知乎