在面向对象的世界中,我们最熟悉的莫过于class、 abstract class和interface。Dart作为一门现代面向对象编程语言,在原有的特性基础上,新增了一些新的特性,今天我们就来聊聊 Mixins。
什么是Mixins
在官方文档中,我们可以看到对Mixins的解释是:
Mixins are a way of reusing a class’s code in multiple class hierarchies.
简单的理解,就是用来复用多个类之间的代码,减少耦合。我们直接来看一个例子。
没有Mixins的从前
假设,我们现在正在开发一个动物大全App,我们需要创建一个Duck
类。作为一个有丰富面向对象编程经验的开发者,你自然的将所有和Duck有相似特征的抽取成一个abstract class。
/// Bird
abstract class Bird {
void shout() {
println('shouting');
}
}
/// WaterborneBird
abstract class WaterborneBird extends Bird {
void swim() {
println('swimming');
}
}
/// Duck
class Duck extends WaterborneBird {
void doDuckThings() {
shout();
swim();
println('quack quack quack!')
}
}
很好,我们清楚的将鸭子归入水中生活的鸟类,加入其它的鸟类也变得非常容易。但是,现在我们需要加入金鱼了,于是我们和上面一样编写代码。
/// Fish
abstract class Fish {
void swim() {
println("swimming")
}
}
/// GoldFish
class GoldFish extends Fish {
void doGoldFishThings() {
swim();
pringln('zzz...');
}
}
这是我们发现金鱼和鸭子一样拥有swim
的特性,在这个例子中是非常简单的,但是如果我们有复杂的行为需要赋予给一个新的类,我们就要大量编写重复的代码了。
使用Mixins
我们声明一个Swimming的mixin:
mixin Swimming {
void swim() {
println('swimming')
}
}
我们可以使用with
关键字将mixin加入到class中,其实看到这里你可能已经回想到我们其实可能已经用过这个with
关键字了。接下来,我们就可以对上面的代码进行改造了:
/// Bird
abstract class Bird {
void shout() {
println('shouting');
}
}
/// Duck
class Duck extends Bird with Swimming {
void doDuckThings() {
shout();
swim();
println('quack quack quack!')
}
}
/// Fish
abstract class Fish {
}
/// GoldFish
class GoldFish extends Fish with Swimming {
void doGoldFishThings() {
swim();
pringln('zzz...');
}
}
另外,你可以将多个mixins放入同一个类中,而且dart对这个数量没有作任何限制。
其它
关于Mixins,还有很多需要注意的事情,我们虽然可以使用Mixins对代码进行一些简化,但是要建立在对需求和类之间的关系准确理解的基础上。建议多去看看Flutter中使用Mixins实现的一些源码,从里面吸取一些正确的经验。