3

我正在尝试在编写我的 iOS 游戏时实现组件编程的概念。

在 Clemens Szyperski 的《组件软件:超越面向对象编程》一书中,他提到了一种策略:

(不是引用)从添加组件 Quack 的 Duck 类开始。Quack 类在调用它的任何对象上实现一个接口,该接口指定一个使用 Quacks quack() 的方法

使用此设置,Duck 对 Quack 没有任何参考或认识,除非它被实例化,并且此后从未在 Duck 中使用过。其他对象可以调用 duckObject.quack() 并在只知道 Duck 对象的情况下到达 Quack。

到目前为止,我一直在尝试实现这一点,但没有成功。最好,Duck 只需要实例化代码,其余代码放在 Quack 类中。这可以在 Objective-C 中完成(对于 iOS?),还是我最好离开 COP 使用其他语言?

4

2 回答 2

2

我认为在 ObjC 中没有确切的比较,但听起来你想研究message forwarding。如果向对象发送了一条它没有响应的消息,则在发出错误信号之前,运行时会发送该对象forwardInvocation:,并带有一个NSInvocation封装消息和参数的参数。

forwardInvocation:,一个对象可以将调用传递给另一个处理该消息的对象。这允许一个实例响应 message ,即使它没有由 实现,通过持有对 的实例的引用,它确实实现了它:DuckquackquackDuckQuack

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    if( [myQuack respondsToSelector:[anInvocation selector]] ){
        [anInvocation invokeWithTarget:someOtherObject];
    }
    else{
        [super forwardInvocation:anInvocation];
    }
}
于 2012-04-12T07:02:55.813 回答
0

不太确定你的问题是什么。听起来你想要一个对类的弱引用。首先是鸭类

//Duck.h
#import "Quack.h"

@interface Duck : NSObject {
    Quack *quacker;
}

@property (nonatomic, retain) Quack *quacker;

@end

//Duck.m

@implementation Duck
@synthesize quarker;

-(id) init {
    self = [super init];

    if(self) {

    }

    return self;
}

-(Quack *)quacker {
    if(quacker == nil) {
        [self setQuacker:[[[Quack alloc] init] autorelease]];
    }

    return quacker;
}

@end

然后实现 Quack 类。

//Quack.h

@interface Quack : NSObject {

}

-(void)quack;

@end

//Quack.m

@implementation Quack 

-(id) init {
    self = [super init];

    if(self) {

    }

    return self;
}

-(void)quack {
    NSLog(@"quack");
}
@end

现在在你想要的任何课程中:

//RandomClass.m
[[[self duck] quacker] quack];
于 2012-04-12T06:59:26.423 回答