gpt4 book ai didi

dart - 如何在Dart中从父类到子类进行回调

转载 作者:行者123 更新时间:2023-12-03 03:35:48 26 4
gpt4 key购买 nike

我有一个抽象类,它将字符串添加到列表中并执行其他一些操作。

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.
}

为父类(super class)提供回调方法的最干净方法是什么?
  • 我不能在构造函数中传递它,因为它是一个实例方法。
  • 我无法使其静态,因为它需要访问该实例。
  • 我宁愿不公开子类之外的回调方法/ setter 。
  • 父类(super class)和子类将不在同一个库中。
  • 最佳答案

    您可以在setCallback抽象类中创建类似于Abc的方法,该方法可以设置回调,但不再允许调用它。这将允许我们在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
    }

    关于dart - 如何在Dart中从父类到子类进行回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61268470/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com