天天看點

Dart語言詳解-8 Mixin8 Mixin

8 Mixin

可以了解為多繼承。

Dart語言詳解-8 Mixin8 Mixin
main() {
  Bicycle().transport();
  Motorcycle().transport();
  Car().transport();
  WoodenCar().transport();  //四輪木制腳踏車
}

//交通工具類,擁有運輸功能
abstract class Transportation {
  //運輸功能
  void transport();
}

//自行車
class Bicycle extends Transportation
    with TwoWheelTransportation, LowSafetyIndex, BodyEnergyTransportation {
  @override
  void transport() {
    print(
        "自行車:\n動力元件: ${powerUnit()} , 安全指數: ${safetyIndex()} , 動力來源:${energy()}");
  }

//  String safetyIndex() => "low";
//
//  String powerUnit() => "兩個輪子";
//
//  String energy() => "全靠腿登";
}

//機車
class Motorcycle extends Transportation
    with TwoWheelTransportation, LowSafetyIndex, GasolineEnergyTransportation {
  @override
  void transport() {
    print(
        "機車:\n動力元件: ${powerUnit()} , 安全指數: ${safetyIndex()} , 動力來源:${energy()}");
  }

//  String safetyIndex() => "low";
//
//  String powerUnit() => "兩個輪子";
//
//  String energy() => "汽油";
}

//汽車
class Car extends Transportation
    with
        FourWheelTransportation,
        MiddleSafetyIndex,
        GasolineEnergyTransportation {
  @override
  void transport() {
    print(
        "汽車:\n動力元件: ${powerUnit()} , 安全指數: ${safetyIndex()} , 動力來源:${energy()}");
  }

//  String safetyIndex() => "middle";
//
//  String powerUnit() => "四個輪子";
//
//  String energy() => "汽油";
}

//雙輪交通工具
class TwoWheelTransportation {
  String powerUnit() => "兩個輪子";
}

//四輪交通工具,一般來說安全性能為中
class FourWheelTransportation {
  String powerUnit() => "四個輪子";
}

//安全指數中等的交通工具兒
class MiddleSafetyIndex {
  String safetyIndex() => "middle";
}

//安全指數低的交通工具兒
class LowSafetyIndex {
  String safetyIndex() => "low";
}

//人力發動機
class BodyEnergyTransportation {
  String energy() => "全靠腿登";
}

//汽油能源交通工具
class GasolineEnergyTransportation {
  String energy() => "汽油";
}

//四輪木制腳踏車
class WoodenCar extends Car
//    with LowSafetyIndex, BodyEnergyTransportation
//implements LowSafetyIndex, BodyEnergyTransportation
    {
  @override
  void transport() {
    print(
        "四輪木制腳踏車:\n動力元件: ${powerUnit()} , 安全指數: ${safetyIndex()} , 動力來源:${energy()}");
  }
}
           

列印:

自行車:
動力元件: 兩個輪子 , 安全指數: low , 動力來源:全靠腿登
機車:
動力元件: 兩個輪子 , 安全指數: low , 動力來源:汽油
汽車:
動力元件: 四個輪子 , 安全指數: middle , 動力來源:汽油
四輪木制腳踏車:
動力元件: 四個輪子 , 安全指數: middle , 動力來源:汽油
           

順序問題:

void main(){
  var messageAB = AB().getMessage();
  print(messageAB);
  var messageBA = BA().getMessage();
  print(messageBA);
  var messageC = C().getMessage();
  print(messageC);
  var messageCC = CC().getMessage();
  print(messageCC);
}

//順序問題
//如果2個或多個超類擁有相同簽名的A方法,那麼子類會以繼承的最後一個超類中的A方法為準。
//當然這是子類沒有重寫A方法的前提下,如果子類自己重寫了A方法則以本身的A方法為準
class A {
  String getMessage() => 'A';
}

class B {
  String getMessage() => 'B';
}

class P {
  String getMessage() => 'P';
}

class AB extends P with A, B {}

class BA extends P with B, A {}

class C extends P with B, A {
  String getMessage() => 'C'; //優先級最高的是在具體類中的方法。
}

class CC extends P with B implements A {
} //這裡的implement隻是表明要實作A的方法,這個時候具體實作是再B中mixin了具體實作

           

列印:

B
A
C
B