携手创造,共同成长!这是我参加「日新计划 8 月更文挑战」的第12天,点击查看活动概况
举荐运用线上编辑器 dartpad.cn 进行学习,检验~
什么是混入 Mixin
Mixin
是一种在多重继承中复用某个类中代码的方法模式。运用with
要害字并在这以后跟上 Mixin
类的姓名来运用 Mixin
模式:
class Dog extends Animal with Walk, Bark {
// ...
}
怎样运用混入 Mixin
完结一个 Mixin
类,要创立一个继承自 Object
其没有声明结构函数的类。
mixin Walk {
bool canWalk = true;
// 留心,没有结构函数
void walk() {
print('I can walk.')
}
}
我们运用要害字
mixin
来代替class
完结混入类。
on
要害字(格式:on className
),指定哪些类可以运用该 Mixin
类。我们改写下上面的代码,如下:
// 标明 Walk 类只能被 Animal 类运用
mixin Walk on Animal {
bool canWalk = true;
// 留心,没有结构函数
void walk() {
print('I can walk.')
}
}
混入 Mixin 有什么应用场景
我们举个比如:
// 手机类
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
来完结,比如:
class Phone extends Wechat, Facebook {} ❌
明显不可,抛开 手机继承功用
这个语义话的问题,语法上是不容许多继承的。Dart
容许单继承。
我们可以考虑运用混入 Mixin
。我们来改写下代码:
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 后边的类会掩盖前面的类的同名函数
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 类方法;否则,调用重写的方法。
往期精彩举荐
- Dart 知识点 – 数据类型
- Flutter 开发呈现的那些 Bugs 和解决计划「继续更新… 」
假设读者觉得文章还可以,不防一键三连:关注➕点赞➕保藏