如何在 dart 中执行从 super class 到 subclass 的回调
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 中,每次将字符串添加到列表时我都需要回调。还有其他子class可能需要也可能不需要回调。
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.
}
为 superclass 提供回调方法的最干净的方法是什么?
- 我不能在构造函数中传递它,因为它是一个实例方法。
- 我无法将其设为静态,因为它需要访问实例。
- 我不想公开回调 methods/setters 超出子 class。
- superclass和subclass不会在同一个库中。
您可以在 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
}
我也做了以下解决方案,但它太丑陋而且完全愚蠢,我需要先提出另一个更明智的解决方案......但我会说 "works" 如果意图也是混淆其他人。
以下实现的概念是您不是将变量保存到回调中,而是将变量保存到可以提供回调方法的方法中。
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
,但在这种情况下不允许这样做。
我有一个摘要 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 中,每次将字符串添加到列表时我都需要回调。还有其他子class可能需要也可能不需要回调。
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.
}
为 superclass 提供回调方法的最干净的方法是什么?
- 我不能在构造函数中传递它,因为它是一个实例方法。
- 我无法将其设为静态,因为它需要访问实例。
- 我不想公开回调 methods/setters 超出子 class。
- superclass和subclass不会在同一个库中。
您可以在 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
}
我也做了以下解决方案,但它太丑陋而且完全愚蠢,我需要先提出另一个更明智的解决方案......但我会说 "works" 如果意图也是混淆其他人。
以下实现的概念是您不是将变量保存到回调中,而是将变量保存到可以提供回调方法的方法中。
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
,但在这种情况下不允许这样做。