В абстрактном классе Abc
можно создать метод, подобный 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
}