我正在尝试在编写我的 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/

10-12 13:06