類的分析bash
1 軟件工程師和建築工程師繼承於工程師,工程師繼承於工做者ide
2 美術教師和IT教師繼承於教師,教師繼承於工做者ui
Java版本spa
//工做者
abstract class Worker {
public abstract void doWork();//工做者須要工做
}
//工程師
class Engineer extends Worker {
@Override
public void doWork() {
System.out.println("工程師在工做");
}
}
//教師
class Teacher extends Worker {
@Override
public void doWork() {
System.out.println("教師在教學");
}
}
//軟件工程師
class SoftwareEngineer extends Engineer {
}
//建築工程師
class BuildingEngineer extends Engineer {
}
//美術教師
class ArtTeacher extends Teacher {
}
//IT教師
class ITTeacher extends Teacher {
}複製代碼
Dart版本設計
//工做者
abstract class Worker {
void doWork();//工做者須要工做
}
//工程師
class Engineer extends Worker {
void doWork() {
print('工程師在工做');
}
}
//教師
class Teacher extends Worker {
void doWork() {
print('教師在教學');
}
}
//軟件工程師
class SoftwareEngineer extends Engineer {
}
//建築工程師
class BuildingEngineer extends Engineer {
}
//美術教師
class ArtTeacher extends Teacher {
}
//IT教師
class ITTeacher extends Teacher {
}複製代碼
總結:code
上面的場景感受並無什麼區別,由於Dart是單繼承,對於上面的簡單場景沒法體現出區別cdn
賦予這些職業一些能力blog
類分析:繼承
軟件工程師和IT教師都具有修電腦的能力,建築工程師和美術教師都具有手繪的能力,可是這些能力是他們特有的,不是工程師和教師具有的能力,因此不能在父輩中實現,這個時候就須要一個東西叫作接口。接口
Java版本
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("設計軟件");
}
}
//IT教師
class ITTeacher extends Teacher implements CanFixComputer {
@Override
public void fixComputer() {
System.out.println("修電腦");
}
}複製代碼
Dart版本
abstract class CanFixComputer {
void fixComputer();
}
abstract class CanDesignSoftware {
void designSoftware();
}
//軟件工程師
class SoftwareEngineer extends Engineer implements CanFixComputer, CanDesignSoftware {
void fixComputer() {
print('修電腦');
}
void designSoftware() {
print('設計軟件');
}
}
//IT教師
class ITTeacher extends Teacher implements CanFixComputer {
void fixComputer() {
print('修電腦');
}
}複製代碼
總結:
只有語法上的區別,Dart雖然沒有接口,可是任何一個類就能夠看成接口,因此本質上依然是同樣的,
可是
若是使用Dart的Mixin思想去實現,是怎樣的呢?
1 封裝修電腦能力和設計能力,使用factory關鍵字結合_權限符避免外部實例化和拓展
abstract class CanFixComputer {
factory CanFixComputer._() {
return null;
}
void fixComputer() {
print('修電腦');
}
}
abstract class CanDesignSoftware {
factory CanDesignSoftware._() {
return null;
}
void designSoftware() {
print('設計軟件');
}
}複製代碼
2 使用with
//軟件工程師
class SoftwareEngineer extends Engineer
with CanFixComputer, CanDesignSoftware {
}
//IT教師
class ITTeacher extends Teacher with CanFixComputer {
}複製代碼
總結
每一個具備某項特性的類再也不須要具體去實現一樣的功能,接口是無法實現功能的,而經過繼承的方式雖然能實現功能,但已經有父類,同時不是一個父類,又不能多繼承,因此這個時候,Dart的Mixin機制就比Java的接口會高效,開發上層的只須要關心當前須要什麼特性,而開發功能模塊的關心具體要實現什麼功能。
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 {
void doPrint() {
print('Son1');
}
}
class Son2 extends Father with First implements Second {
void doPrint() {
print('Son2');
}
}
main() {
Son1 son1 = new Son1();
son1.doPrint();
Son2 son2 = new Son2();
son2.doPrint();
}複製代碼
輸出
Son1
Son2複製代碼
總結
優先級最高的老是類內實現的
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 {
}
main() {
Son1 son1 = new Son1();
son1.doPrint();
Son2 son2 = new Son2();
son2.doPrint();
}複製代碼
輸出
Second
First複製代碼
總結
能夠看到,其實在Son2中implements只是說要實現他的doPrint()
方法,這個時候其實具體實現是First中Mixin了具體實現。
而Mixin的具體順序也是能夠從代碼倒過來看的,最後mixin的優先級是最高的。
1 Mixin將功能和類的上層設計分離,上層關心須要什麼特性,開發功能模塊關心具體實現什麼功能
2 若是兩個類繼承於不一樣的父類可是有相同的功能,Mixin的優勢就顯示了出來