Dart中Class、mixin、interface三者間關係及異同

Dart中Class、mixin、interface三者間關係及異同

Class

Dart中一切皆爲對象,而每一個對象都是一個類的實例,全部的類都繼承於Object。編程

除了普通的構造方法,Dart中的Class還提供了不一樣用途的構造方法,好比命名構造方法、重定向構造方法、常量構造方法、工廠構造方法,還有初始化參數列表等。bash

抽象類

抽象類使用abstract關鍵字定義,是不能被實例化的,一般用來定義接口以及部分實現。 但與其餘語言不太同樣的地方是,抽象方法也能夠定義在非抽象類中。編程語言

Interface:

每一個類的內部都隱式的定義了一個接口,這個接口包含類的成員的全部實例,以及類實現的全部接口。 若是你想讓A類支持B類全部的API,而且不經過繼承B類來實現,那麼A類應該實現B接口。 一個類能夠實現一個或多個接口,經過implements關鍵字。ide

mixin

Dart語言集合了現代編程語言的衆多優勢,Mixin繼承機制也是其一。具體的讀法應該叫作 mix in,翻譯下就是混入。ui

mixins是一種實現多重繼承的方式,經過它能夠給現有的類添加特性。spa

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的、沒有構造器的類。code

若是你不想讓mixin類能夠當作普通class同樣使用的話,就是用mixin關鍵字替換class關鍵字。 換句話說,mixin也可使用class關鍵字定義(也能夠是抽象類),也能夠當作普通class同樣使用。orm

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來使用。

參考:

www.dartlang.org/guides/lang…

Flutter基礎:理解Dart的Mixin繼承機制

Mixin是什麼概念?——知乎

相關文章
相關標籤/搜索