Dart的mixin详解

Posted 亦可追寻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart的mixin详解相关的知识,希望对你有一定的参考价值。

mixin 是什么?

Mixin 是一种在多个类层次结构中重用代码的方法。它是Dart里的新特性。

mixin的用途

mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法、变量而不必成为其子类。Mixin的作用就是在多个类层次结构中重用类的代码,在类中混入其他功能,来增强代码的复用能力。 你可以将多个mixins放入同一个类中,而且dart对这个数量没有作任何限制。

mixin的使用

使用with关键字将mixin加入到class中。用一个很简单的例子来说明其使用方法:

1、声明

声明一个mixin

mixin Eat 
    void eat() 
        print(eating);
    


mixin Speak 
    void speak() 
        print(speaking);
    

2、混入到类中(使用with关键字)

abstract class Animal 
    void breath() 
        print(breath);
    


class People extends Animal with Eat Speak  


People这个类继承自Animal类但是混入了Eat和Speak。People 这个类就有了Eat和Speak的属性。

mixin的使用注意事项

  • 作为mixins的类只能继承自Object,不能继承其他类
  • 作为mixins的类不能有构造函数

mixin的深入了解

可以使用关键字 on 来指定哪些类可以使用该 Mixin 类。

当声明一个 mixin 时,on后面的类是使用这个mixin的父类约束。也就是说一个类若是要 with 这个 mixin,则这个类必须继承或实现这个 mixin 的父类约束。 比如有 Mixin 类 A,但是 A 只能被 B 类使用,则可以这样定义 A:

class Musician 
  // ...

mixin MusicalPerformer on Musician 
  // ...

class SingerDancer extends Musician with MusicalPerformer 
  // ...

在这个例子中,只有扩展或实现音乐家类的类才能使用mixin MusicalPerformer。

mixin 的顺序决定了同名方法的调用关系

它类似于扩展类所获得的重用,但它与单继承兼容,因为它是线性的。线性化决定了每次执行的是最上层超类的方法。 原理告诉我们一个非常重要的事情:声明mixins的顺序决定了继承链,即决定了最上层到底层的超类(superclass)的排序。mixin 可以理解为对类的一种“增强”,但它与单继承兼容,因为它的继承关系是线性的。

简单来说with 后面的类会覆盖前面的类的同名方法。看下面这个例子

class A 
  String getMessage() => A;


class B 
  String getMessage() => B;


class P 
  String getMessage() => P;


class AB extends P with A, B 

class BA extends P with B, A 

void main() 
  String result = ;

  AB ab = AB();
  result += ab.getMessage();

  BA ba = BA();
  result += ba.getMessage();

  print(result);

结果是:BA

class A 
  printMessage() => print(A);


mixin B on A 
  printMessage() 
    super.printMessage();
    print(B);
  


mixin C on B 
  printMessage() 
    super.printMessage();
    print(C);
  


class D with A, B, C 
  printMessage() => super.printMessage();


void main() 
  D().printMessage();

输出结果: A B C

在看下面这个例子

class A 
  printMessage() => print(A);


class B 
  printMessage() => print(B);


mixin C on A 
  printMessage() 
    super.printMessage();
    print(C);
  


class D with A, B, C 
  printMessage() => super.printMessage();


void main() 
  D().printMessage();

结果是: B C

是不是以为是 A C

为什么是B C不是A C 呢? 根据前面说的线性关系,D().printMessage()调用的是mixin C中的方法,C中调用super.printMessage() 时,super应该是class D with A, B,所以C中的调用的super.printMessage() 其实是调用的B中的printMessage方法。

思考题

abstract class A 
  void method() 
    print("I am A");
  


class B extends A 
  void method() 
    print("I am B");
  


mixin Mixin on A 
  void method() 
    super.method();
    print("Mixin");
  


class Test extends B with Mixin 


void main() 
    Test cli = new Test();
    cli.method();

结果是什么?

答案 I am B Mixin

以上是关于Dart的mixin详解的主要内容,如果未能解决你的问题,请参考以下文章

Dart语言学习(十三) Dart Mixins 实现多继承

在 Dart 中何时使用 mixins 以及何时使用接口?

深入理解 Dart 中的继承和 Minxins

[Dart] Mixin

dart 可以生成可读的 javascript 库吗?

Dart 中的 extends / with / implements