我正在尝试在编写我的 iOS 游戏时实现组件编程的概念。
在 Clemens Szyperski 所著的《组件软件:超越面向对象编程》一书中,他提到了一种策略:
(不是引用)
从添加组件 Quack 的 Duck 类开始。
Quack 类在调用它的任何对象上实现一个接口(interface),该接口(interface)指定了一个使用 Quacks quack() 的方法
通过这种设置,除了实例化之外,Duck 没有任何关于 Quack 的引用或意识,并且此后再也没有在 Duck 中使用过。其他对象可以调用duckObject.quack() 并在只知道Duck 对象的情况下到达Quack。
到目前为止,我一直在尝试实现这一点,但没有成功。最好,Duck 不需要比实例化更多的代码,其余的放在 Quack 类中。这可以在 Objective-C 中完成吗(对于 iOS?),还是我最好将 COP 留给其他语言?
最佳答案
我认为 ObjC 中没有确切的比较,但听起来您想研究 message forwarding 。如果一个对象被发送了一条它没有响应的消息,就在发出错误信号之前,运行时发送对象 forwardInvocation:
,带有封装消息和参数的 NSInvocation
参数。
在 forwardInvocation:
中,一个对象可以将调用传递给另一个处理该消息的对象。这允许 Duck
实例响应消息 quack
,即使 quack
没有由 Duck
实现,通过持有对 Quack
实例的引用,它确实实现了它:
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
if( [myQuack respondsToSelector:[anInvocation selector]] ){
[anInvocation invokeWithTarget:someOtherObject];
}
else{
[super forwardInvocation:anInvocation];
}
}
关于Objective-C 和组件编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10118502/