由于java开发人员有时习惯于使用这种方法:
// init
Map<Class, Handler> map = new HashMap<Class, Handler>;
map.put(MyClass1.class, new Handler1());
map.put(MyClass2.class, new Handler2());
// later
Handler handler = map.get(currentObject.getClass());
handler.handle();
在Objective-c中是否有类似的方法?
p。我知道这可能可以用另一种方式解决:MyClass可以返回处理程序实例(基方法和在继承程序中重写),但这并不好,因为MyClassN不知道处理程序,它可以在运行时解决。
在Objective-C中这样做的习惯方法是在Categories中定义方法,而不是使用反射。
类别允许您"从外部"向类添加方法,并像使用类的一部分一样使用该方法。在Java中没有类似的机制,所以您需要通过使用反射来补偿它。
// For separate testing you can put handlers in a separate class
@interface Handlers
+(void)handler1;
+(void)handler2;
@end
// Below is the mapping code. It goes in a separate file
@interface MyClass1 (Handler)
-(void)handleMessage;
@end
@implementation MyClass1
-(void)handleMessage {
[Handlers handler1];
}
@end
@interface MyClass2 (Handler)
-(void)handleMessage;
@end
@implementation MyClass2
-(void)handleMessage {
[Handlers handler2];
}
@end
这个设置允许您在MyClass1
和MyClass2
的对象上调用handleMessage
,并且运行时将正确地将消息分派给正确的方法:
id someObject = ... // <<== Set an object of MyClass1 or MyClass2
[someObject handleMessage]; // Calls the right method, even though the classes themselves do not declare it
如果您使用这种设置,您可以从类别中单独测试处理程序方法,它提供"粘合逻辑"(与Java Map
相同的方式),但不参与消息的实际"有效负载"处理。