3

iOSゲームを作成しながら、コンポーネントプログラミングの概念を実装しようとしています。

Clemens Szyperskiによる本「ComponentSoftware:Beyond Object-Oriented Programming」の中で、彼は戦術について言及しています。

(引用符ではありません)コンポーネントQuackを追加するDuckクラスから始めます。クラスQuackは、それを呼び出すオブジェクトにインターフェイスを実装します。インターフェイスは、Quacks quack()を使用するメソッドを指定します。

この設定では、Duckは、インスタンス化された場合を除いて、Quackに関する参照や認識がなく、それ以降Duckで使用されることはありません。他のオブジェクトは、duckObject.quack()を呼び出して、Duckオブジェクトのみを認識しながらQuackに到達できます。

これまでのところ、私はこれを実装しようとして成功していません。できれば、Duckはインスタンス化以上のコードを必要とせず、残りはQuackクラスに配置されます。これはObjective-C(iOSの場合)で実行できますか、それとも他の言語にCOPを残したほうがいいですか?

4

2 に答える 2

2

ObjC に正確な比較があるとは思いませんが、メッセージ転送を調べたいようです。オブジェクトが応答しないメッセージを送信された場合、エラーが通知される直前に、ランタイムは、メッセージと引数をカプセル化forwardInvocation:する引数を使用してオブジェクトを送信します。NSInvocation

ではforwardInvocation:、オブジェクトは、そのメッセージを処理する別のオブジェクトに呼び出しを渡すことができます。これにより、 によって実装されていなくても、 のインスタンスへの参照を保持することにより、Duckインスタンスはメッセージ に応答できます。quackquackDuckQuack

- (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 に答える