목록에 문자열을 추가하고 다른 작업을 수행하는 추상 클래스가 있습니다.
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.
}
콜백 메서드로 수퍼 클래스를 제공하는 가장 깨끗한 방법은 무엇입니까?
당신은 같은 방법을 만들 수 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
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다