類比Java理解Dart的Mixin繼承機制

本文使用的案例以下,一個類關係圖


1 使用Dart和Java實現該類

類的分析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

2 場景拓展

賦予這些職業一些能力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思想去實現,是怎樣的呢?

3 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的接口會高效,開發上層的只須要關心當前須要什麼特性,而開發功能模塊的關心具體要實現什麼功能。

4 順序的問題

demo1

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複製代碼

總結

優先級最高的老是類內實現的

demo2

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的優勢就顯示了出來

相關文章
相關標籤/搜索