/**
* Dart中一个类实现多个接口
*
*
* Mixins的中文意思就是混入, 就是在勒种混入其他功能
* 在Dart中可以使用mixins实现类似多继承的功能
* 因为mixins使用的条件, 随着Dart版本一直在变,目前写的只是2.x中的
* 1.作为mixins的类只能继承自Object, 不能继承其他类
* 2.作为mixins的类不能有构造函数
* 3.一个类可以mixins多个mixins类
* 4.mixins 不是继承, 也不是接口, 而是一种新的特性
*
*
* 如果继承的和mixins混合得到的方法或者属性名称有相同的, 那么最后一个混合的类的方法和属性将覆盖前面相同的方法
*/
// 建议使用抽象类定义接口
abstract class A {
String name;
printA();
run() {
print("xxxxxx");
}
}
abstract class B {
printB();
}
main(List<String> args) {
C c = new C();
c.printA();
c.printB();
c.run();
D d = new D();
d.name = "我是通过mixins来获得的";
d.printA();
d.printB();
print("-----------------------------");
E e = new E("大王");
e.say();
e.printA();
e.printB();
print(e is A); //true
print(e is B); //true
print(e is Person); //true
}
// 使用implements是需要实现接口里面的所有的属性和方法
// 如果需要继承一个抽象类,那么用extends,
// 如果不需要继承,而是需要完全复写接口里面的所有的属性和方法就用implements
class C extends A implements B {
@override
String name;
@override
printA() {
print("printA");
}
@override
printB() {
print("printB");
}
}
// 使用mixins, 这里面的A, B两个类只能是继承自Object,不能继承自其他类, 同时A,B两个类不能有构造函数
class D with A, B {
@override
printA() {
print("这是使用mixins后获得的name属性 , name =${this.name}");
}
@override
printB() {
print("B类没有name属性,但是因为mixins了A类, 所有可以用this.name = ${this.name}");
}
}
class Person {
String nickname;
Person(this.nickname);
say() {
print("这是${this.nickname}");
}
}
// E类也可以先继承Person类, 然后在通过mixins混合得到A,B的属性和方法
// 这样E就有了Person的方法和属性, 同时也有了A,B的方法和属性, 如果Person,A,B有相同的方法和属性, 那么最后一个将覆盖之前的
class E extends Person with A, B {
E(String nickname) : super(nickname);
@override
printA() {
print("这是使用mixins后获得的nickname属性 , nickname =${this.nickname}");
}
@override
printB() {
print(
"B类没有nickname属性,但是因为mixins了A类, 所有可以用this.nickname = ${this.nickname}");
}
}