在面向?qū)ο蟮氖澜缰校覀冏钍煜さ哪^于class、 abstract class和interface撮抓。Dart作為一門現(xiàn)代面向?qū)ο缶幊陶Z言衷畦,在原有的特性基礎上栗涂,新增了一些新的特性,今天我們就來聊聊 Mixins祈争。
什么是Mixins
在官方文檔中斤程,我們可以看到對Mixins的解釋是:
Mixins are a way of reusing a class’s code in multiple class hierarchies.
簡單的理解,就是用來復用多個類之間的代碼菩混,減少耦合忿墅。我們直接來看一個例子。
沒有Mixins的從前
假設沮峡,我們現(xiàn)在正在開發(fā)一個動物大全App疚脐,我們需要創(chuàng)建一個Duck
類。作為一個有豐富面向?qū)ο缶幊探?jīng)驗的開發(fā)者邢疙,你自然的將所有和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!')
}
}
很好望薄,我們清楚的將鴨子歸入水中生活的鳥類,加入其它的鳥類也變得非常容易照卦。但是式矫,現(xiàn)在我們需要加入金魚了,于是我們和上面一樣編寫代碼役耕。
/// Fish
abstract class Fish {
void swim() {
println("swimming")
}
}
/// GoldFish
class GoldFish extends Fish {
void doGoldFishThings() {
swim();
pringln('zzz...');
}
}
這是我們發(fā)現(xiàn)金魚和鴨子一樣擁有swim
的特性采转,在這個例子中是非常簡單的,但是如果我們有復雜的行為需要賦予給一個新的類瞬痘,我們就要大量編寫重復的代碼了故慈。
使用Mixins
我們聲明一個Swimming的mixin:
mixin Swimming {
void swim() {
println('swimming')
}
}
我們可以使用with
關鍵字將mixin加入到class中,其實看到這里你可能已經(jīng)回想到我們其實可能已經(jīng)用過這個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對這個數(shù)量沒有作任何限制拆撼。
其它
關于Mixins,還有很多需要注意的事情喘沿,我們雖然可以使用Mixins對代碼進行一些簡化闸度,但是要建立在對需求和類之間的關系準確理解的基礎上。建議多去看看Flutter中使用Mixins實現(xiàn)的一些源碼蚜印,從里面吸取一些正確的經(jīng)驗莺禁。