Ответ Александра правильный, но я хотел бы кое-что добавить.
Я предполагаю, что делегирование Proxy
является деталью реализации, и мы не хотим, чтобы пользователь подвергался этому воздействию. В этом случае у нас должна быть некоторая обработка случаев, когда методы вызываются для parser
, которые не поддерживаются Proxy
. Прямо сейчас, если вы сделаете это:
void main() {
var parser = new Parser();
print(parser.foo());
}
Вы получаете эту ошибку:
Unhandled exception:
Compile-time error during mirrored execution: <Dart_Invoke: did not find static method 'Proxy.foo'.>
Я бы написал код в noSuchMethod
немного по другому. Прежде чем делегировать Proxy
, я бы проверил, поддерживает ли Proxy
метод, который я собираюсь вызвать. Если Proxy
поддерживает это, я бы вызвал метод на Proxy
, как описывает Александр в своем ответе. Если Proxy
не поддерживает метод, я бы выкинул NoSuchMethodError
.
Вот исправленная версия ответа:
import 'dart:mirrors';
class Parser {
noSuchMethod(Invocation invocation) {
ClassMirror cm = reflectClass(Proxy);
if (cm.methods.keys.contains(invocation.memberName)) {
return cm.invoke(invocation.memberName
, invocation.positionalArguments
/*, invocation.namedArguments*/ // not implemented yet
).reflectee;
}
throw new NoSuchMethodError(this,
_symbolToString(invocation.memberName),
invocation.positionalArguments,
_symbolMapToStringMap(invocation.namedArguments));
}
}
String _symbolToString(Symbol symbol) => MirrorSystem.getName(symbol);
Map<String, dynamic> _symbolMapToStringMap(Map<Symbol, dynamic> map) {
if (map == null) return null;
var result = new Map<String, dynamic>();
map.forEach((Symbol key, value) {
result[_symbolToString(key)] = value;
});
return result;
}
class Proxy {
static String hello() { return "hello"; }
static String world() { return "world"; }
}
main(){
var parser = new Parser();
print(parser.hello());
print(parser.world());
print(parser.foo());
}
И вот результат выполнения этого кода:
hello
world
Unhandled exception:
NoSuchMethodError : method not found: 'foo'
Receiver: Instance of 'Parser'
Arguments: []
person
Shailen Tuli
schedule
03.07.2013