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详解相关推荐

  1. Dart的语法详解系列篇(1)---- 老司机用一篇博客带你快速熟悉Dart语法

    声明:本文是作者AWeiLoveAndroid原创,版权归作者AWeiLoveAndroid所有,侵权必究.如若转发,请注明作者和来源地址!未经授权,严禁私自转载! _________________ ...

  2. python教程:mixin详解

    1.什么是Mixin 在面向对象编程中,Mixin是一种类,这种类包含了其他类要使用的方法,但不必充当其他类的父类.其他类是如何获取Mixin中的方法因语言的不同而不同.所以有时候Mixin被描述为' ...

  3. Python中的Mixin详解

    一些闲聊: Mixin是一种设计模式.设计思想 并不是某个特定的class或者函数. Java中的Mixin叫interface Ruby中的Mixin叫Module [2]优点: 1.mixin设计 ...

  4. 干货 | Dart 并发机制详解

    Dart 通过 async-await.isolate 以及一些异步类型概念 (例如 Future 和 Stream) 支持了并发代码编程.本篇文章会对 async-await.Future 和 St ...

  5. 详解Dart中如何通过注解生成代码

    简介:详解dart与java注解生成代码异同点 作者:闲鱼技术-龙湫 1.背景 最近在项目中使用到了Dart中的注解代码生成技术,这跟之前Java中APT+JavaPoet生成代码那套技术还是有一些不 ...

  6. dart系列之:元世界pubspec.yaml文件详解

    文章目录 简介 pubspec.yaml支持的字段 一个例子 字段详情 总结 简介 pubspec.yaml是所有dart项目的灵魂,它包含了所有dart项目的依赖信息和其他元信息,所以pubspec ...

  7. Flutter(Dart)基础——函数详解

    Flutter(Dart)基础--函数详解 在Dart中,函数(或方法)也是对象,它的类型是 Function. 这意味着,函数可以赋值给变量,也可以当做其他函数的参数. 函数的声明 基本上与Java ...

  8. 导出jar插件_Fluttify输出的Flutter插件工程详解

    系列文章: yohom:Fluttify输出的Flutter插件工程详解​zhuanlan.zhihu.com yohom:开发Flutter插件必备原生SDK->Dart接口生成引擎`Flut ...

  9. python编程入门与案例详解pdf-Flutter技术入门与实战 PDF 清晰版

    给大家带来的一篇关于Flutter相关的电子书资源,介绍了关于Flutter入门.Flutter实战.Flutter技术方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小162.5 MB, ...

最新文章

  1. Tensorflow【实战Google深度学习框架】全连接神经网络以及可视化
  2. 请求模式解决共享资源冲突
  3. java stringbuffer原理_String,StringBuilder,StringBuffer 实现原理解析
  4. 【完结】总结12大CNN主流模型架构设计思想
  5. python中缩进规则的例外
  6. Java Throwable initCause()方法与示例
  7. 翻译:RealEyes OSMF Player Sample - 第二部分:建立和配置 (转载)
  8. 图片模糊处理批量生产模糊数据集
  9. adb 命令大全(简洁明了)adb命令启动应用
  10. 广告投放管理平台 oython源码_【直播】全新腾讯广告投放管理平台如何帮助广告主乘风破浪?...
  11. 麦迪逊大学计算机科学咋样,威斯康星大学麦迪逊分校计算机科学
  12. 现在还有必要安装第三方杀毒软件吗?
  13. Win7浏览器老是自动弹出网页怎么解决?【系统天地】
  14. 音乐 美术 劳技 计算机教研组工作总结,综合教研组教学工作总结
  15. centos7 k8s1.5.2(kubernetes) etcd flannel dns dashboard nginx tomcat slb haproxy keepalived
  16. 十个Mac端设计软件
  17. start.spring.io网站访问不到
  18. eNSP配置PC路由
  19. 我阅读SDK源码的思路
  20. 新笑傲江湖手游如何用电脑玩 新笑傲江湖手游PC电脑版玩法教程

热门文章

  1. 傅里叶变换(真正的通俗易懂)
  2. Sampler 在数据下沉模式超时; 不同Sampler策略,在非数据下沉模式下,模型训练失败 报错Segmentation fault(core dumped)
  3. 陶云机器人_小帅智能机器人app
  4. 字节、字、字长之间的关系
  5. 计算机格式化什么意思,格式化硬盘是什么意思?怎么格式?格式了有什么用?会有什么后果?...
  6. SMU Wunter(div.2)5
  7. HX711称重模块的使用
  8. Visual Studio 2017 安装及使用(新手)
  9. jQuery 操作属性
  10. MySQL中的cast()函数用法