0

特定のクラスのインスタンスを初期化するクラスを作成しています。このクラスは、すべて共通のスーパークラスからサブクラス化されたいくつかの異なるタイプのクラスを初期化するために使用されます。現在、インスタンス変数を使用しています。

Class templateClass;

クラスタイプを保存します。メソッドがtemplateClassでサポートされていないというコンパイラの警告が表示されます。これらの警告を抑制したり、テンプレートクラスが特定のクラスのサブクラスでなければならないことを指定したりする方法はありますか?
また、これはObjective-cでこれを実行するための理想的な方法ですか?使用するクラスを指定する別の方法はありますか?
助けてくれてありがとう!

編集:私が書いているクラスは、ランダムに選択された場所にスプライトを作成し、それらを制限するためのいくつかの変数を使用するように設計されています。このクラスは、rezzesするクラスにinitWithX:(int)pos yVariance:(int)varianceメソッドがあることを期待しています。これは、あなたが言及したプロトコルを使用して定義できると思います。作成する必要のあるスプライトのタイプごとに、rezzingクラスの複数のインスタンスを作成します。initWithTemplateClass:(Class)templateClass作成するスプライトのタイプを定義するためにrezzingクラスを送信できるようにしたいと思います。これが正しい方法であるかどうかはわかりませんが、コンパイラーは、このメソッドinitWithX:(int)pos yVariance:(int)varianceがtemplateClassで使用できないと投稿しているためです。私はこれについて私が行っている方法に問題があると思います。警告を表示しているコードは次のとおりです。

[self addChild:[[templateClass alloc] initWithX:positionOfChild  
  yVariance:(random()%(rowVarianceSize+1))]];
4

2 に答える 2

4

必要なすべてのメソッドを含むプロトコルを定義できます。次に、クラスがそのプロトコルに準拠していることを宣言します。

于 2010-08-22T22:45:07.817 に答える
1

2番目の代替案を追加するために編集

あなたがしていることをしようとする単純なテストケースをコンパイルするとき、私はその警告を受け取りません (また、私は期待していませんでした)。

そうは言っても、あなたがしていることは完全に合理的なようです。「addChild」の例にはリークがありますが。新しいオブジェクトを割り当て/初期化し、保持カウントが 1 になると、('self' が UIView であると仮定して) addChild への呼び出しもオブジェクトを保持しますが、解放する独自の参照はありません。

id obj = [[templateClass alloc] initWithX:positionOfChild yVariance:(random()%(rowVarianceSize+1))]];
[self addChild:obj];
[obj release], obj = nil;

また、プロトコルを定義するという Vladimir の提案は良いものです。そうすれば、与えられた templateClass がそのプロトコルに準拠していることを確認する実行時チェックを挿入することもできます。

if ([templateClass conformsToProtocol:@protocol(Foo)]) {
    id<Foo> obj = [[templateClass alloc] initWithX:positionOfChild yVariance:(random()%(rowVarianceSize+1))]];
    [self addChild:obj];
    [obj release], obj = nil;
} else {
    // Do whatever you want to do if templateClass isn't correct.
    // Obviously you could also have the protocol conformance check elsewhere.
}

ただし、これらすべての代替手段として、Class インスタンス変数を使用する代わりに、必要な特定のタイプのスプライトを作成するファクトリ オブジェクトのインターフェイスを定義することができます。次に、適切なファクトリ クラス インスタンスを渡します。

例えば:

@interface Sprite : UIView {
}
- (id)initWithX:(int)pos yVariance:(int)variance;
@end

@interface SpriteFactory {
}
- (Sprite*)createSprite;
@end

次に、サブクラスのペアを作成します。Sprite サブクラスと、その種のスプライトを作成する SpriteFactory サブクラスです。

次に、「Class templateClass」を使用する代わりに、「SpriteFactory* factory」を使用します。

于 2010-08-23T00:33:36.693 に答える