2021-03-15 dart语言中的多继承实现方式

在 Dart 语言中,是不支持多继承的,这是由语言设计决定的。但是 Flutter 提供了一种类似多继承的方式,即使用 Mixin。

Mixin 是一种在类中重用一个或多个类中代码的方式。在 Flutter 中,我们可以使用 Mixin 来组合多个类的功能,从而实现类似多继承的效果。

class (普通类)
abstract class 类(抽象类)
mixin类(混入类)

mixin类,与abstract class有些通用的地方,可以理解为abstract class的升级版。

  • 它相对于abstract class说,可以同时混入多个Mixin。
  • 并且可以通过on关键字来限制使用范围。

1、三种类:

  • class 普通类 (成员方法必须要实现)
    声明一个类,提供具体的成员变量和方法实现。

  • abstract class 抽象类 (定义抽象方法)
    声明一个抽象类,抽象类将无法被实例化。抽象类常用于声明接口方法、有时也会有具体的方法实现。

  • mixin 混入类(不能有构造方法)
    声明一个Mixin类,与抽象类一样无法被实例化,是一种在多重继承中复用某个类中代码的方法模式,可以声明接口方法或有具体的方法实现。
    mix不支持extends继承和with混入 其他类。可以implements实现其他类。
    参考:https://juejin.cn/post/7094642592880525320

2、继承、混入、实现、约束, 4个关键字:

  • 1、extends 继承
    继承,和其它语言的继承没什么区别。

  • 2、with 多继承(父类不能有构造方法)
    使用Mixin模式混入一个或者多个Mixin类。
    特点:
    mixin类,可以with (混入)类,抽象类(这里的类和抽象需要:无任何继承和混入的类)、 mixin类。支持on
    mixin类不能混入和继承其他类。

  • 在面向对象的编程语言中,Mixin是包含供其他类使用的方法的类,而不必是其他类的父类。其他类如何访问Mixin的方法取决于语言。Mixin有时被描述为“包含的”而不是“继承的”。
    Mixins鼓励代码重用,并且可用于避免多重继承可能导致的继承歧义(菱形问题),或者用于解决语言中缺少对多重继承的支持的问题。Mixin还可以被视为具有实现方法的接口。这个模式是执行依赖倒置原则的一个例子。
  • c++棱形继承和解决方法.棱形继承,数据荣誉问题https://blog.csdn.net/m0_60447315/article/details/125929140
  • 继承歧义,也叫菱形问题,也叫做钻石问题,或者有时被称为致命的死亡钻石。当两个B和C类继承自A,D类继承自B和C时产生歧义。如果A中有一个方法在B和C中已经重写,而D没有重写它,那么D继承的方法的版本是B,还是C?
    https://cloud.tencent.com/developer/article/1381007
    pv64ku21r7.png
  • 3、implements 继承(父类方法必须要实现)
    实现一个或多个接口并实现每个接口定义的API。

  • 4、on 约束(继承mixin类的类,必须同时继承约束类)
    限制Mixin的使用范围。

  • 每一个类都隐式地定义了一个接口并实现了该接口,这个接口包含所有这个类的成员变量以及这个类所实现的其它接口。
  • 如果想让抽象类同时可被实例化,可以为其定义工厂构造函数。具体内容可以参考:抽象类的实例化* mixin关键字在Dart 2.1中才被引用支持。早期版本中的代码通常使用 abstract class代替
WX20230202-141701@2x.png

3、代码实例

mixin ClassA {
  //专门定义为混入类 
  method1();
}

abstract class ClassA2 {
  method2(); //如果没有加abstract,不是抽象类。方法必须要实现
}

class ClassA4 {}

mixin ClassA3 on ClassA4 {
  //添加约束,继承ClassA3的类,也必须继承成ClassA4
  method3();
}

class ClassA5 {
  method4() {
    print("12");
  }
}

class ClassC implements ClassA5 {
  //implements必须要实现父类方法
  method4() {
    print("12");
  }
}

class ClassD extends ClassA5 {
  //

}

class ClassB extends ClassA5 with ClassA4, ClassA, ClassA2, ClassA3 {
  //with后面可以接抽象类, ClassA4必须要放在ClassA3前面
  //多继承的方法一定要实现
  method1() {
    print("12");
  }

  //with后面的抽象类,方法也一定要实现
  method2() {
    print("12");
  }

  method3() {
    print("12");
  }
}

void main() {
  var b = ClassB();
  b.method1();
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关窗热,开窗呛,我该怎么办・_・? 想念21度的小城了╯^╰
    a04d8498ab45阅读 864评论 0 0
  • 10 条方法论:(自己的实践总结) 1. 朋友圈四件套: 1.1 头像:要专业,给人以好感 1.2 个人标签:强调...
    EF202102阅读 3,655评论 0 0
  • 相同的婚姻,不同的命运 有这样两对夫妻,第一对夫妻要生小孩,孕妇是一个高龄产妇,同时有这高血压。男的不想要这个小孩...
    雨蒙_0771阅读 1,222评论 0 0
  • 貌似又漏更一天。 菠萝派很成功,孩子说比麦当劳的好吃;菠萝切的比较大块,并且没有放玉米淀粉,一口下去酸甜都很浓郁。...
    xiangyier阅读 968评论 0 0
  • 推荐指数: 6.0 书籍主旨关键词:特权、焦点、注意力、语言联想、情景联想 观点: 1.统计学现在叫数据分析,社会...
    Jenaral阅读 10,997评论 0 5