使用Objective-c中的反射进行映射?

时间:2014-05-25 19:11:41

标签: java objective-c reflection

由于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中是否有类似的方法?

PS。我知道这可能以另一种方式解决:MyClass可以返回Handler实例(基本方法和继承者中的覆盖),但它不好,因为MyClassN不知道Handler,它可以在运行时解析f.e。

1 个答案:

答案 0 :(得分:1)

在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

此设置允许您在handleMessageMyClass1的对象上调用MyClass2,运行时将正确地将消息分派给正确的方法:

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的做法相同)但不参与实际的“有效负载” “处理消息。