物件的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。

留言

這個網誌中的熱門文章

AppScript如何串聯BloggerAPI

factory模式 (建構子)