Dart的mixin详解
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详解相关推荐
- Dart的语法详解系列篇(1)---- 老司机用一篇博客带你快速熟悉Dart语法
声明:本文是作者AWeiLoveAndroid原创,版权归作者AWeiLoveAndroid所有,侵权必究.如若转发,请注明作者和来源地址!未经授权,严禁私自转载! _________________ ...
- python教程:mixin详解
1.什么是Mixin 在面向对象编程中,Mixin是一种类,这种类包含了其他类要使用的方法,但不必充当其他类的父类.其他类是如何获取Mixin中的方法因语言的不同而不同.所以有时候Mixin被描述为' ...
- Python中的Mixin详解
一些闲聊: Mixin是一种设计模式.设计思想 并不是某个特定的class或者函数. Java中的Mixin叫interface Ruby中的Mixin叫Module [2]优点: 1.mixin设计 ...
- 干货 | Dart 并发机制详解
Dart 通过 async-await.isolate 以及一些异步类型概念 (例如 Future 和 Stream) 支持了并发代码编程.本篇文章会对 async-await.Future 和 St ...
- 详解Dart中如何通过注解生成代码
简介:详解dart与java注解生成代码异同点 作者:闲鱼技术-龙湫 1.背景 最近在项目中使用到了Dart中的注解代码生成技术,这跟之前Java中APT+JavaPoet生成代码那套技术还是有一些不 ...
- dart系列之:元世界pubspec.yaml文件详解
文章目录 简介 pubspec.yaml支持的字段 一个例子 字段详情 总结 简介 pubspec.yaml是所有dart项目的灵魂,它包含了所有dart项目的依赖信息和其他元信息,所以pubspec ...
- Flutter(Dart)基础——函数详解
Flutter(Dart)基础--函数详解 在Dart中,函数(或方法)也是对象,它的类型是 Function. 这意味着,函数可以赋值给变量,也可以当做其他函数的参数. 函数的声明 基本上与Java ...
- 导出jar插件_Fluttify输出的Flutter插件工程详解
系列文章: yohom:Fluttify输出的Flutter插件工程详解zhuanlan.zhihu.com yohom:开发Flutter插件必备原生SDK->Dart接口生成引擎`Flut ...
- python编程入门与案例详解pdf-Flutter技术入门与实战 PDF 清晰版
给大家带来的一篇关于Flutter相关的电子书资源,介绍了关于Flutter入门.Flutter实战.Flutter技术方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小162.5 MB, ...
最新文章
- Tensorflow【实战Google深度学习框架】全连接神经网络以及可视化
- 请求模式解决共享资源冲突
- java stringbuffer原理_String,StringBuilder,StringBuffer 实现原理解析
- 【完结】总结12大CNN主流模型架构设计思想
- python中缩进规则的例外
- Java Throwable initCause()方法与示例
- 翻译:RealEyes OSMF Player Sample - 第二部分:建立和配置 (转载)
- 图片模糊处理批量生产模糊数据集
- adb 命令大全(简洁明了)adb命令启动应用
- 广告投放管理平台 oython源码_【直播】全新腾讯广告投放管理平台如何帮助广告主乘风破浪?...
- 麦迪逊大学计算机科学咋样,威斯康星大学麦迪逊分校计算机科学
- 现在还有必要安装第三方杀毒软件吗?
- Win7浏览器老是自动弹出网页怎么解决?【系统天地】
- 音乐 美术 劳技 计算机教研组工作总结,综合教研组教学工作总结
- centos7 k8s1.5.2(kubernetes) etcd flannel dns dashboard nginx tomcat slb haproxy keepalived
- 十个Mac端设计软件
- start.spring.io网站访问不到
- eNSP配置PC路由
- 我阅读SDK源码的思路
- 新笑傲江湖手游如何用电脑玩 新笑傲江湖手游PC电脑版玩法教程
热门文章
- 傅里叶变换(真正的通俗易懂)
- Sampler 在数据下沉模式超时; 不同Sampler策略,在非数据下沉模式下,模型训练失败 报错Segmentation fault(core dumped)
- 陶云机器人_小帅智能机器人app
- 字节、字、字长之间的关系
- 计算机格式化什么意思,格式化硬盘是什么意思?怎么格式?格式了有什么用?会有什么后果?...
- SMU Wunter(div.2)5
- HX711称重模块的使用
- Visual Studio 2017 安装及使用(新手)
- jQuery 操作属性
- MySQL中的cast()函数用法