4

私は目的を学ぼうとしているだけです-c。

さまざまな言語にわたるAbstractFactoryパターンのウィキペディアの例を見てきました。

ボタンの定義は次のとおりです。

@protocol Button
- (void)paint;
@end

@interface WinButton : NSObject <Button>
@end

これが工場です:

@implementation WinFactory
- (id)createButton {
    return [[[WinButton alloc] init] autorelease];
}
@end

私の知る限り、obj-cのidキーワードはC#varやC ++ 11のようなものでなければなりませautoんよね?

だから私は私の質問です:

なぜファクトリが指定されていない型のジェネリックオブジェクトを返すようにするのですか?これはエラー(ファクトリがボタン以外のものを返すようにする)ですか、それともそれを行う理由がありますか?

私はこのように工場を書きます:

@implementation WinFactory
- (id<Button>)createButton {
    return [[[WinButton alloc] init] autorelease];
}
@end 

私が間違っている?

4

3 に答える 3

6

なぜファクトリが指定されていない型のジェネリックオブジェクトを返すようにするのですか?

多くの場合、id返されるのは、それらが一貫して型指定されていない(実際には抽象オブジェクト)か、暗黙のアップキャストが導入されているためです。

これはエラー(ファクトリがボタン以外のものを返すようにする)ですか、それともそれを行う理由がありますか?

エラーではありません。もちろん、一致しないタイプを返すことはできません。

私はこのように工場を書きます:…私は間違っていますか?

@implementation WinFactory
- (id<Button>)createButton {
    return [[[WinButton alloc] init] autorelease];
}
@end

このシナリオの大きな落とし穴は、ObjCの型が非常に緩いことであり、すべてのセレクターのパラメーターと戻り値の型が一致するように努力する必要があります。つまりcreateButton、すべての翻訳ですべて同じタイプが返され、パラメーターのタイプが同じである必要があります。コンパイラのあいまいさを避けるために、よりわかりやすい名前を選択しなければならない場合があります。

それはなぜ+[NSString string]戻るのかを説明するはずidです-それが戻った場合NSString、それ+[NSMutableString string]は警告の原因になる可能性があります。これは、コンパイラがメソッド宣言を動的インスタンスに一致させるのに困難な(不可能な)時間を費やす可能性があるためです。これは、メソッド内の型も含むコンビニエンスコンストラクターなどのセレクターの「言葉の多い」命名を理解するのにも役立ちます(たとえば+[NSDictionary dictionaryWithObject:]、単にではなく+[NSDictionary withObject:])。

しかし、あなたの質問にたどり着くために:id<Button>またはNSObject<Button>*、または他の修飾されたタイプは、その一般的なメソッドシグネチャを使用できる限り、問題ありません。あなたは型修飾を導入しています。これはコンパイラがあなたを助けるのに役立ちます

于 2012-08-27T13:28:34.400 に答える
4

ここでのより正しいリターンタイプは次のようになります:

- (id<Button>)createButton;

<Button>これは、返される型がプロトコルに準拠するオブジェクトであることを意味します。もう少し明確にするために、WPページを修正する場合があります。プロトコルは、完全性のために(そして実際の使用を単純化するために)プロトコル<Button>からも継承する必要があります。<NSObject>

抽象ファクトリパターンはObjCではやや珍しいことに注意してください。UIKitやFoundationで使われているケースを考えてみました。クラスがこれを内部的に(のようにNSNumber)処理するのがより一般的であり、クラスクラスターと呼ばれます。

ObjCでC++またはC#スタイルでコーディングしようとする場合は十分に注意してください。ObjCは静的言語ではなく、使用されるパターンは多くの場合まったく異なります。(AFが静的なパターンであると言っているのではありません。ObjCで非常にうまく使用できます。ObjCを学習しようとしているときにAFを見ているということは、逆方向にアプローチしている可能性があることを意味します。 、「ObjCでこのC ++をどのように開発するか」を学ぶのではなく、「ObjCでこのC ++をどのように行うか」を学ぶ)

于 2012-08-27T13:29:06.723 に答える
0

Objective-Cには、抽象ファクトリであるクラスクラスタの概念があります。 この答えを参照してください。

于 2014-08-16T05:47:54.197 に答える