dart系列之:dart類的擴展

簡介

雖然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中,我們需要注意的是,子類對父類的實現會有下面幾個限制:

  1. 子類的實現方法的返回值,必須和父類返回值相同,或者是父類返回值的子類。
  2. 子類的實現方法的參數,必須和父類方法參數相同,或者是父類參數的父類。
  3. 子類方法的參數必須和父類的參數個數相同。

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的高級應用,我們會在後續的文章中進行介紹,敬請期待。

本文已收錄於 //www.flydean.com/07-dart-extend/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!