Dart 知识点 - 混入 Mixin
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
推荐使用线上编辑器 dartpad.cn 进行学习,测试~
什么是混入 Mixin
Mixin
是一种在多重继承中复用某个类中代码的方法模式。使用 with
关键字并在其后跟上 Mixin
类的名字来使用 Mixin
模式:
bash
class Dog extends Animal with Walk, Bark {
// ...
}
怎么使用混入 Mixin
实现一个 Mixin
类,要创建一个继承自 Object
其没有声明构造函数的类。
bash
mixin Walk {
bool canWalk = true;
// 注意,没有构造函数
void walk() {
print('I can walk.')
}
}
我们使用关键字
mixin
来代替class
实现混入类。
on
关键字(格式:on className
),指定哪些类可以使用该 Mixin
类。我们改写下上面的代码,如下:
bash
// 表明 Walk 类只能被 Animal 类使用
mixin Walk on Animal {
bool canWalk = true;
// 注意,没有构造函数
void walk() {
print('I can walk.')
}
}
混入 Mixin 有什么应用场景
我们举个例子:
```bash // 手机类 class Phone { void startUp() { print('start up'); } void shutDown() { print('shut down'); } }
// sms - wechat class Wechat { void sms() { print('install wechat'); } }
// sms - facebook class Facebook { void sms() { print('install facebook'); } }
// ios 手机 class IosPhone extends Phone { @override void startUp() { print('ios phone can start up'); } }
// android 手机 class AndroidPhone extends Phone { @override void startUp() { print('android phone can start up'); } }
```
假设现在我有一台 iPhone
的手机,里面有 Wechat
和 Facebook
,我们使用 extends
来实现,比如:
bash
class Phone extends Wechat, Facebook {} ❌
明显不行,抛开 手机继承功能
这个语义话的问题,语法上是不允许多继承的。Dart
允许单继承。
我们可以考虑使用混入 Mixin
。我们来改写下代码:
```bash void main() { IosPhone nameJimmy = new IosPhone(); nameJimmy.startUp(); // ios phone can start up nameJimmy.sms(); // install facebook
AndroidPhone nameIvy = new AndroidPhone(); nameIvy.startUp(); // android phone can start up nameIvy.sms(); // install wechat nameIvy.specialFn(); // facebook special function }
// 手机类 class Phone { void startUp() { print('start up'); } void shutDown() { print('shut down'); } }
// sms - wechat mixin Wechat { void sms() { print('install wechat'); } }
// sms - facebook mixin Facebook { void sms() { print('install facebook'); }
void specialFn() { print('facebook special function'); } }
// ios 手机 class IosPhone extends Phone with Facebook { @override void startUp() { print('ios phone can start up'); } }
// android 手机 class AndroidPhone extends Phone with Facebook, Wechat { @override void startUp() { print('android phone can start up'); } } ```
细心的读者应该发现了,Wechat
和 Facebook
上都有 sms
的功能,为什么 nameIvy.sms()
中打印出来的是 install wechat
呢?这就涉及到了重名方法处理。
重名方法处理
通过上面的代码示例,我们知道:
- with 后面的类会覆盖前面的类的同名函数
```bash void main() { IosPhone nameJimmy = new IosPhone(); nameJimmy.startUp(); // ios phone can start up nameJimmy.sms(); // I have mine }
// sms - facebook mixin Facebook { void sms() { print('install facebook'); } }
// ios 手机 class IosPhone with Facebook { @override void startUp() { print('ios phone can start up'); }
@override void sms() { print('I have mine'); } } ```
我们现在重写 sms
的方法,然后调用的时候,会调用 IosPhone
的重写方法。那么我们可以得到:
- 类中重写了
Mixin
类中的方法,调用类自己的方法
我们总结一下:如果当前使用的类没有重写 Mixin 类的方法,则调用距离 with 最远的 Mixin 类方法;否则,调用重写的方法。
往期精彩推荐
如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏
- 前端开发中 5 个很赞的资源
- 懂点心理学 - 马太效应
- Flutter 构建一个 todo list 应用
- Dart 知识点 - 数据类型
- Dart 知识点 - 混入 Mixin
- Dart 知识点 - 集合 List, Set, Map
- Flutter - 使用 push(), pop() 和路由进行导航
- Dart 知识点 - 面向对象基础
- Flutter: Stateful 挂件 vs Stateless 挂件
- Flutter 实现登录 UI
- Dart 知识点 - 抽象类和接口
- 自 2020 年以来全球的开源商业化软件融资情况
- IstioCon 2022 回顾及录像、PPT 分享
- 网页实现 1CM 物理长度
- Flutter 开发出现的那些 Bugs 和解决方案「持续更新... 」
- 仿写新闻客户端
- Beyond Istio OSS —— Istio 服务网格的现状及未来
- 在外企的工作生活「年中总结」
- 如何在 Istio 中集成 SPRIRE?
- Javascript尾递归编程