我了解Dart語法就是參照上面鏈接文章
重點(diǎn)理解mixin
mixin,翻譯過來就是混入,個(gè)人理解是可以在原來類的基礎(chǔ)上插入新的類的方法及實(shí)現(xiàn),原來的類可以直接調(diào)用mixin類的方法
場(chǎng)景:

java里面的實(shí)現(xiàn)如下:
interface CanFixComputer { void fixComputer();}
?interface CanDesignSoftware { void designSoftware();}?
?//軟件工程師
?class SoftwareEngineer extends Engineer implements CanFixComputer, CanDesignSoftware {?
?????@Override public void fixComputer() { System.out.println("修電腦"); ?}?
?????@Override public void designSoftware() { System.out.println("設(shè)計(jì)軟件"); }?
}
?//IT教師class ITTeacher extends Teacher implements CanFixComputer {?
?????@Override public void fixComputer() { System.out.println("修電腦"); }?
}
dart里面的實(shí)現(xiàn)如下:
abstract class CanFixComputer { void fixComputer();}?
?abstract class CanDesignSoftware { void designSoftware();}
//軟件工程師?
class SoftwareEngineer extends Engineer implements CanFixComputer, CanDesignSoftware {
????void fixComputer() { print('修電腦'); }
????void designSoftware() { print('設(shè)計(jì)軟件'); }
}
//IT教師
class ITTeacher extends Teacher implements CanFixComputer {
????void fixComputer() { print('修電腦'); }
}
還是上面的例子,在Dart里面,如果運(yùn)用Mixin思想的呈現(xiàn):
abstract class CanFixComputer {
?????factory CanFixComputer._() { return null; }?
?????void fixComputer() { print('修電腦'); }?
}?
?abstract class CanDesignSoftware {?
?????factory CanDesignSoftware._() { return null; }?
?????void designSoftware() { print('設(shè)計(jì)軟件'); }?
}
//軟件工程師
class SoftwareEngineer extends Engineer with CanFixComputer, CanDesignSoftware {}?
?//IT教師?
class ITTeacher extends Teacher with CanFixComputer {}
使用情況:
ITTeacher itTeacher = new ITTeacher();?
?itTeacher.doWork();
?itTeacher.fixComputer();?
SoftwareEngineer softwareEngineer = new SoftwareEngineer();
softwareEngineer.doWork();?
?softwareEngineer.fixComputer();
?softwareEngineer.designSoftware();
這里關(guān)鍵字從?implements 變成了 with,而且,每個(gè)具有某項(xiàng)特性的類不再需要具體去實(shí)現(xiàn)同樣的功能,Dart的Mixin機(jī)制就比Java的接口會(huì)高效,開發(fā)上層的只需要關(guān)心當(dāng)前需要什么特性,而開發(fā)功能模塊的關(guān)心具體要實(shí)現(xiàn)什么功能
extends,with,implements?順序的理解
class First {?
?????void doPrint() { print('First'); }
?}?
?class Second {?
?????void doPrint() { print('Second'); }?
}
?class Father {?
?????void doPrint() { print('Father'); }?
}????
?class Son1 extends Father with First,Second {
?}
?class Son2 extends Father with First implements Second {
?}
class Son3 extends Father with First implements Second {
? ??void doPrint() { print('Son'); }
}
?main() {
?Son1 son1 = new Son1();
?son1.doPrint();?
?Son2 son2 = new Son2();?
?son2.doPrint();?
?Son3 son3 = new Son3();??son3.doPrint();?
}
控制臺(tái)輸出:
Second?
First
Son
implements 只說要實(shí)現(xiàn)某個(gè)方法,自身不負(fù)責(zé)實(shí)現(xiàn)
所以可以看出,優(yōu)先級(jí):在自身類的實(shí)現(xiàn) >mixin(如果存在沖突,后面的覆蓋前面的)>父類
多重繼承
當(dāng)只使用mixin時(shí),mixin類的聲明最好使用mixin關(guān)鍵字
mixin First on Father {
? ? ?void doPrint() { print('Father'); }
?} ? ?
當(dāng)使用on關(guān)鍵字,自身不能作為父接口,表示該mixin只能在它的子類使用?
class Son extends Father with First {
}
多重繼承場(chǎng)景:
mixin First on Father {
? ? void init() {
? ? ? ? print('First init');
? ? ? ? super.init();
? ? ? ? print('First end');
????}
}
mixin Second on Father {
? ? void init() {
? ? ? ? print('Second init');
? ? ? ? super.init();
? ? ? ? print('Second end');
????}
}
class Father {
? ? void init() {
? ? ? ? print('Father init');
????}
????Father() {?
?????????init();
????}?
}
class Son extends Father with First,Second {
? ? @override
? ? void init() {
? ? ? ? print('Son init');
? ? ? ? super.init();
? ? ? ? print('Son end');
? ? }
}
控制臺(tái)輸出:
Son init
Second init
First init
Father init
First end
Second end
Son end
學(xué)習(xí)參考鏈接:kevinWu的博客
OVER,THANKS