簡介
雖然dart中的類只能有一個父類,也就是單繼承的,但是dart提供了mixin語法來繞過這樣限制。
今天,和大家一起來探討一下dart類中的繼承。
使用extends
和JAVA一樣,dart中可以定義一個父類,然後使用extends來繼承他,得到一個子類,如下所示:
class Student{
}
class Boy extends Student{
}
在子類中,可以使用super關鍵詞來呼叫父類的方法。
抽象類和介面
dart中除了繼承普通類之外,還可以繼承抽象類和實現介面。
抽象類是以abstract關鍵詞修飾的class,如下所示:
abstract class Student{
String getName();
}
抽象類中通常會有抽象方法,抽象方法需要在子類中進行實現。
當然抽象類中也可以有具體實現的方法,但是抽象類不可以被例項化,如果你想在抽象類中例項化物件,這可以使用之前我們提到的工廠建構函式。
和java不同的是,dart中並沒有interface,他引入的是一個Implicit interfaces的概念。
對應每個物件來說,都隱式定義了一個包含類中所有方法和屬性的介面。
一般來說,如果一個物件包含另外一個物件的結構和方法,但是他們之間的內容又是不一樣的,則可以使用implements來隱式實現介面,如下所示:
class Student{
String name;
String get _name => name;
}
class Girl implements Student{
@override
String name;
@override
String get _name => "girls";
}
在dart中一個類可以implements多個介面。
上面的例子中,我們用到了@override註解,他表示子類對父類方法或者屬性的重寫。
在使用@override中,我們需要注意的是,子類對父類的實現會有下面幾個限制:
- 子類的實現方法的返回值,必須和父類返回值相同,或者是父類返回值的子類。
- 子類的實現方法的引數,必須和父類方法引數相同,或者是父類引數的父類。
- 子類方法的引數必須和父類的引數個數相同。
mixins
雖然dart不支援多重繼承,但是可以使用mixin來實現類似多重繼承的功能。
要使用mixins,可以使用關鍵字with,如下所示:
class Boy extends Student with Person {
// ···
name='boy';
myName();
}
在dart中mixin是一個特殊的類,使用關鍵詞mixin來描述,mixin的類中,沒有建構函式,如下所示:
mixin Person {
String name='';
void myName() {
print('my name is:'+name);
}
}
在mixin中可以定義有用的方法和屬性,繼承mixin的類可以重寫對應的屬性和方法,從而達到自定義的功能。
在mixin中我們也可以指定特定的類,也就是說只有特定的類才能夠使用mixin,則可以使用關鍵詞on,如下所示:
mixin Person on Boy{
String name='';
void myName() {
print('my name is:'+name);
}
}
總結
以上就是dart中繼承的使用,dart中還可以繼承方法,這是dart的高階應用,我們會在後續的文章中進行介紹,敬請期待。
本文已收錄於 http://www.flydean.com/07-dart-extend/
最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!