[英]How to call Super Class method if there is a Mixin with a method with the same name
該代碼(此處為要點)將打印e
。 如果我刪除覆蓋,即從Baz
刪除output
,它將從Bar
打印w
。
這使我得出結論,方法“優先級”是own class
->
mixin
->
super class
。
如果我添加更多的mixin,例如:
mixin Zoo {
output() {
print('j');
}
}
class Baz extends Foo with Bar, Zoo {
// ...
現在,輸出為j
。 如果我在Bar
and Zoo
周圍交換:
class Baz extends Foo with Zoo, Bar {
// ...
現在,輸出再次是w
。
因此,我將這樣定義優先級: own class
->
last mixin
->
nth-last mixin
->
super class
。
我有什么方法可以控制這種行為,即,即使mixin
具有相同名稱的方法,也可以調用超級調用方法?
您可能想知道為什么我要這樣做,而不僅僅是重命名方法。
好吧,在Flutter中,所有State
都有一個dispose
方法,如果我也有一個具有dispose
方法的mixin
,它將破壞State
的功能,因為如上所述, mixin
的dispose
方法具有優先權。
super.output
也將調用mixin方法,這就是為什么它不起作用。 您可以嘗試將以下構造函數添加到Baz
:
Baz() {
super.output();
}
即使此方法可行,也無濟於事,因為Flutter案例中的dispose
方法是從外部調用的。
在mixins中- 聲明 mixins 的順序非常重要 。
當您將mixin應用於課程時,
Dart中的Mixins通過創建一個新類來工作,該新類將mixin的實現層放在超類之上,從而創建一個新類-它不是超類的“側面”,而是“上層”,因此在其中沒有歧義如何解析查詢源
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 {}
void main() {
String result = '';
AB ab = AB();
result += ab.getMessage();
BA ba = BA();
result += ba.getMessage();
print(result);
}
AB類和BA類都使用A和B混合來擴展P類,但是順序不同。 A,B和P這三個類都有一個稱為getMessage的方法。
首先,我們調用AB類的getMessage方法,然后調用BA類的getMessage方法。
輸出將是BA
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.