1.子類沒有重寫超類A方法的前提下,如果2個或多個超類擁有相同簽名的A方法,那麼子類會以繼承的最後一個超類中的A方法爲準。
2.如果子類自己重寫了A方法則以本身的A方法爲準。
Mixin.dart
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()}");
}
}
//順序問題
//如果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了具體實現
輸出:
D:\flutter\bin\cache\dart-sdk\bin\dart.exe --enable-asserts --enable-vm-service:26667 D:\Code\Flutter\FlutterHello\flutter_app\lib\mixfun.dart
lib/mixfun.dart: Warning: Interpreting this as package URI, 'package:flutterapp/mixfun.dart'.
Observatory listening on http://127.0.0.1:26667/m6rhdqB453s=/
自行車:
動力組件: 兩個輪子 , 安全指數: low , 動力來源:全靠腿登
摩托車:
動力組件: 兩個輪子 , 安全指數: low , 動力來源:汽油
汽車:
動力組件: 四個輪子 , 安全指數: middle , 動力來源:汽油
四輪木製腳踏車:
動力組件: 四個輪子 , 安全指數: middle , 動力來源:汽油
Process finished with exit code 0