簡體   English   中英

如果存在具有相同名稱的方法的Mixin,那么如何調用Super Class方法

[英]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的功能,因為如上所述, mixindispose方法具有優先權。

補充筆記

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM