物件的MIXIN機制和它的使用限制
【Java的Interface只能定義接口名稱,無法定義它的內容,而且擴充了接口等於要負責提供實作內容。MIXIN機制提供了類似Interface的機制,但可以直接定義內容。】
(本文為iT邦的文章閱讀後想法,原文作者似乎不熟悉Java。)
(另外參考了簡書上的文章。)
mixin似乎是種特殊物件類別的宣告方式,一個物件可以「擴充」多個MIXIN物件。
mixin物件本身沒辦法(也不需要)宣告建構子。
使用方式(擴充mixin物件)為「with MIXIN物件名稱」
mixin Android {
String android() => "I'm android developer.";
}
mixin IOS {
String ios() => "I'm ios developer.";
}
class Language {
String name;
int ver;
Language(this.name, this.ver);
String introduce() => "I'm $name. Nice to meet you.";
}
class Flutter extends Language with Android, IOS{
Flutter(String name, int ver): super(name, ver);
}
void main() {
var coder = new Flutter('Tracy', 23);
print(coder.introduce());
print(coder.android());
print(coder.ios());
}
下面這個範例可以看到...
1.mixin物件可以設置參數。
2.mixin的函數可以不提供實作內容。(類似abstract。)
mixin DrawFunc {
String content = '..';
String what();
void draw() {
print('I can draw ${what()}');
}
}
class Teacher with DrawFunc {
String what() => "car";
}
void main() {
Teacher().draw();
}這是個設置在物件X內的mixin物件。
藉由使用「限定類別:on 」可以限制這個mixin物件一定要用來擴充X物件。
mixin DrawFunc on X {
String content = '..';
String what();
void draw() {
print('I can draw ${what()}');
}
}但這似乎不表示限定的條件一定要指向外物件,也可以是其他mixin物件,也就是可以「多重限定。」
(因為mixin物件能否寫出內部mixin物件還是個未知數,需要有空做實驗。如果不行,也就表示限定的邏輯使用並不局限於內部物件。)
要注意!使用了「多重限定」的mixin物件在實作時,依然要進行擴充。
例如如果mixinA有限定在mixinB上,那擴充時,要「with mixinB, mixinA」,mixinB必須要在mixinA之前,否則編譯時會出錯。
特別說明:
假設物件OA和mixin物件MB和MC都有同名同式的函數log(),則擴充了他們全部的物件OX中的log執行後會怎樣?
OA的log一定會被覆寫掉。「with」後的mixin物件屬性會比extends的高。但同為「with」內的MB和MC則是看「誰寫在後面」來決定。
如果MB寫在後面,MB的log為主,反之則是MC。
留言
張貼留言