Dart 中的mixins混入

发布于 2021-07-11  0 次阅读


mixins的中文意思是混入,就是在类中混入其他功能

在Dart中可以使用mixins实现类似多继承的功能

Dart2.x中使用mixins的条件:

1. 作为mixins的类只能继承自Object,不能继承其他类;
2. 作为mixins的类不能有构造函数;
3. 一个类可以mixins多个mixins类;
4. mixins不是继承,也不是接口,而是一种全新的特性。

使用with进行mixins混入

class A {
  void printInfoA() {
    print('This is A.');
  }
}

class B {
  void printInfoB() {
    print('This is B.');
  }
}

class C with A, B {}

void main() {
  C c = new C();
  c.printInfoA();
  c.printInfoB();
}

作为mixins的类不能有构造函数

20210711152823911

继承时可以加入mixins混入(继承的函数可以有构造函数)

class D {
  String name;
  num age;
  D(this.name, this.age);
  void printInfoD() {
    print('This is $name, age:$age');
  }
}

class A {
  void printInfoA() {
    print('This is A.');
  }
}

class B {
  void printInfoB() {
    print('This is B.');
  }
}

class C extends D with A, B {
  C(String name, num age) : super(name, age);
}

void main() {
  C c = new C('zhangsan', 21);
  c.printInfoA();
  c.printInfoB();
  c.printInfoD();
}

mixins的类具有相同名的函数,with最后的类将会覆盖之前的

这将输出:
This is A.
This is zhangsan, age:21


class D {
  String name;
  num age;
  D(this.name, this.age);
  void printInfoD() {
    print('This is $name, age:$age');
  }
}

class A {
  void printInfo() {
    print('This is A.');
  }
}

class B {
  void printInfo() {
    print('This is B.');
  }
}

class C extends D with A, B {
  C(String name, num age) : super(name, age);
}

void main() {
  C c = new C('zhangsan', 21);
  c.printInfo();
  c.printInfoD();
}

mixins的类型就是其超类的子类型

均为true


class D {
  String name;
  num age;
  D(this.name, this.age);
  void printInfoD() {
    print('This is $name, age:$age');
  }
}

class A {
  void printInfo() {
    print('This is A.');
  }
}

class B {
  void printInfo() {
    print('This is B.');
  }
}

class C extends D with A, B {
  C(String name, num age) : super(name, age);
}

void main() {
  C c = new C('zhangsan', 21);
  print(c is A);
  print(c is B);
  print(c is C);
  print(c is D);
}

平平无奇的在校大学生