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

相关文章
相关标签/搜索