• Dart(11)-mixin


    一、什么是mixin

    通俗的讲,mixin(mix-in)是一种新的语言特性,表面类似多继承,使用with关键字对类添加一些功能。官话mixin是在多个类层次结构中重用类代码的一种方法。mixin(mix-in)是为面向对象程序设计语言中的类提供了方法的实现。其他类可以访问mixin类的方法、变量而不必成为其子类。Mixin 的作用就是在多个类层次结构中重用类的代码,很好的解决了单继承带来的代码冗余问题。

    二、Mixin历史

    Dart 1.12或更低版本使用Mixin时必须继承至Object,并且不能调用super()方法。

    Dart 1.13或更高版本支持继承至Object以外的类并使用Mixin,并且可以调用super.method()。这项支持仅在DartVM中默认开启,并且在标志后面的Analyzer中才能够使用。更具体地说,它位于命令行分析器中的--supermixin标志之后。它也可以在分析服务器中,在客户端可配置选项后面。Dart2js和dartdevc不支持SuperMixin。

    Dart 2.1.0添加了mixin关键字,用于显式声明mixin。为了兼容起见,Dart仍然允许您混入未使用定义的类mixin。但是,这是有风险的。如果该类的作者不希望将该类用作混入,则他们可能会以打破混入限制的方式更改该类。例如,如果他们添加一个构造函数,则您的mixin将无法使用(The class 'xxx' can't be used as a mixin because it declares a constructor.)

    三、理解mixin与继承

    先举个栗子,我想在杏树上嫁接梨树代码如下:

    1. void main() {
    2.  Apricot().flower();
    3. }
    4. /**
    5. * 杏树
    6. */
    7. class Apricot with Pair {
    8. }
    9. /**
    10. * 梨树
    11. * class 可以用mixin代替
    12. */
    13. class Pair{
    14.  void flower() {
    15.    print('梨花');
    16. }
    17. }

    这样的话,杏树上就开了梨花。mixin可以理解成嫁接,就像是你嫁接在我身上之后,我继承了你的功能,我俩合体了,这属于捆绑的关系,并不是父子的关系。

    为什么dart语言的设计者,不设计出可以多继承的语法,而要设计mixin来替代多继承,是因为多继承会导致菱形问题,所以一直都是单继承。

    四、mixin的线性化

    4.1 mixin之间的线性化

    概述里讲到with后面如果有多个mixin,且有相同的函数,只会用离with最远的那个mixin里面的方法。即mixin的线性化。如下代码:

    1. void main() {
    2.  Apricot().flower();
    3. }
    4. /**
    5. * 杏树
    6. */
    7. class Apricot with Pair , Peach{
    8. }
    9. /**
    10. * 梨树
    11. */
    12. mixin Pair{
    13.  void flower() {
    14.    print('梨花');
    15. }
    16. }
    17. /**
    18. * 桃树
    19. */
    20. mixin Peach{
    21.  void flower() {
    22.    print('桃花');
    23. }
    24. }

    如果本体里面如果有相同的函数,只会调用本体里面的方法。代码如下:

    1. void main() {
    2.  Apricot().flower();
    3. }
    4. /**
    5. * 杏树
    6. */
    7. class Apricot with Pair{
    8.  void flower() {
    9.    print('杏花');
    10. }
    11. }
    12. /**
    13. * 梨树
    14. */
    15. mixin Pair{
    16.  void flower() {
    17.    print('梨花');
    18. }
    19. }

    4.2 mixin与extends之间的优先级

    1. void main() {
    2.  Apricot().flower();
    3. }
    4. /**
    5. * 杏树
    6. */
    7. class Apricot extends Peach with Pair implements Apple{
    8. }
    9. abstract class Apple {
    10.  void flower();
    11. }
    12. /**
    13. * 桃树
    14. */
    15. class Peach{
    16.  void flower() {
    17.    print('桃花');
    18. }
    19. }
    20. /**
    21. * 梨树
    22. */
    23. mixin Pair {
    24.  void flower() {
    25.    print('梨花');
    26. }
    27. }

    相同方法的调用顺序:本体>with>extends>implements

    五、限定符on

    限定符on主要是用于对mixin进行使用限定,当一个mixin后面跟着on xxClass(这里可以是类、接口、抽象类),那么使用这个mixin的宿主必须继承这个xxClass。如下:

    1. /**
    2. * 果树
    3. */
    4. class Fruiter {
    5. }
    6. /**
    7. * 杏树
    8. */
    9. class Apricot extends Fruiter  with Pair, Peach {
    10. }
    11. /**
    12. * 桃树
    13. */
    14. class Peach {
    15.  void flower() {
    16.    print('桃花');
    17. }
    18. }
    19. /**
    20. * 梨树
    21. */
    22. mixin Pair on Fruiter {
    23.  void flower() {
    24.    print('梨花');
    25. }
    26. }

    而on又有点像extends,比如:

    1. abstract class Super {
    2.  void create() {
    3.    print("Super");
    4. }
    5. }
    6. class Clazz implements Super {
    7.  void create() {
    8.    print("Create Clazz");
    9. }
    10. }
    11. mixin Mixin on Super {
    12.  void create() {
    13.    super.create();
    14.    print("Create Mixin");
    15. }
    16. }
    17. class Clazzz extends Clazz with Mixin {
    18. }
    19. void main() {
    20.  Clazzz().create();
    21. }

    Mixin类中可以使用super.create()函数,

    六、总结

    被mixin定义的类不能实例化,不能有构造器

    mixin不能使用extends继续其他类

    一个类可以混入多个mixin

    mixin可以使用implements实现接口

    使用混入mixin,这不是继承关系

  • 相关阅读:
    NASM汇编教程翻译02 第二讲 程序正确退出
    DevOps落地实践点滴和踩坑记录-(1)
    算法通过村第九关-二分(中序遍历)白银笔记|二分搜索
    【小程序】使用font-awesome字体图标的解决文案(图文)
    从JDK8升级到JDK17
    适合能源企业的文档安全外发系统应该是什么样的?
    软文推广中媒体矩阵的优势在哪儿
    TCP的十一种状态集
    高性能设计要点
    MATLAB | 全网唯一 MATLAB双向弦图(有向弦图)绘制
  • 原文地址:https://blog.csdn.net/life491249957/article/details/126026475