8 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