簡體   English   中英

如何從超級 class 回調到 dart 中的子類

[英]How to do a callback from super class to subclass in dart

我有一個抽象的 class 將字符串添加到列表並執行其他一些操作。

abstract class Abc {
  final _list = <String>[];
  Function(String) addedValue;

  void add(String s) {
    _list.add(s);
    if (this.addedValue != null) this.addedValue(s);
  }
}

在我的子類中,每次將字符串添加到列表時,我都想要一個回調。 還有其他子類可能需要也可能不需要回調。

class Xyz extends Abc {
  String _data = '';

  Xyz() {
    this.addedValue = _added;
  }

  void _added(String s) {
    _data += '$s,';
    print('data: $_data');
  }
}
main() {
  var a = Xyz();
  a.add('hello');
  a.add('goodbye');

  a.addedValue('a'); // Prefer if this was not possible.
  a.addedValue = null; // Prefer if this was not possible.
}

為超類提供回調方法的最簡潔方法是什么?

  • 我不能在構造函數中傳遞它,因為它是一個實例方法。
  • 我不能讓它 static 因為它需要訪問實例。
  • 我不希望在子類之外公開回調方法/設置器。
  • 超類和子類不在同一個庫中。

您可以在Abc抽象 class 中創建一個類似setCallback的方法,這樣可以設置回調但不再允許調用它。 這將允許我們在Xyz的構造函數中設置回調:

abstract class Abc {
  final _list = <String>[];
  Function(String) _addedValue;

  void add(String s) {
    _list.add(s);
    if (this._addedValue != null) this._addedValue(s);
  }

  void setCallback(Function(String) callback) => _addedValue = callback;
}

class Xyz extends Abc {
  String _data = '';

  Xyz() {
    setCallback(_added);
  }

  void _added(String s) {
    _data += '$s,';
    print('data: $_data');
  }
}

main() {
  var a = Xyz();
  a.add('hello');
  a.add('goodbye');

  a.addedValue('a'); // No longer possible
  a.addedValue = null; // No longer possible
}

我也提出了以下解決方案,但它是如此丑陋和完全愚蠢,以至於我需要先提出另一個更明智的解決方案......但如果意圖也讓其他人感到困惑,我會說它“有效”。

以下實現的概念是您不是將變量保存到回調中,而是將變量保存到可以提供回調方法的方法中。

abstract class Abc {
  final _list = <String>[];
  Function(String) Function(Abc) _getCallback;

  Abc(this._getCallback);

  void add(String s) {
    _list.add(s);
    if (this._getCallback != null && this._getCallback(this) != null)
      this._getCallback(this)(s);
  }
}

class Xyz extends Abc {
  String _data = '';

  Xyz() : super((obj) => obj is Xyz ? obj._added : null);

  void _added(String s) {
    _data += '$s,';
    print('data: $_data');
  }
}

main() {
  var a = Xyz();
  a.add('hello');
  a.add('goodbye');

  a.addedValue('a'); // No longer possible
  a.addedValue = null; // No longer possible
}

這是我想出來的。

abstract class Abc {
  final _list = <String>[];
  //final Function(Abc, String) _addedValue;
  final dynamic _addedValue;

  Abc(this._addedValue);

  void add(String s) {
    _list.add(s);
    if (this._addedValue != null) this._addedValue(this, s);
  }
}

class Xyz extends Abc {
  String _data = '';

  Xyz() : super(Xyz._added);

  static void _added(Xyz instance, String s) {
    instance._data += '$s,';
    print('data: ${instance._data}');
  }
}

main() {
  var a = Xyz();
  a.add('hello');
  a.add('goodbye');
}

我希望能夠在Abc中正確鍵入_addedValue ,但dynamic是我讓它工作的唯一方法。 嘗試了covariant ,但在這種情況下是不允許的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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