天天看點

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

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是什麼概念?——知乎

繼續閱讀