2010-12-04 6 views
2

私は 異なるタイプのオブジェクトは

それは同じ機能にこれらの2つのオブジェクトの変数を転送することが可能であるNSObjectの

AObject、BObject

から2つのオブジェクトのサブクラスを作成しましたか?私はXcodeでテスト

-(void)myFunction:(AObject *)obj; 

-(void)myFunction:(BObject *)obj; 

として、それが許可されていません。 交換方法はありますか?

は、いくつかのオプションがあります任意のコメントに

おかげ InterDevの

答えて

2

ようこそ。ここで気になる4、自分の長所と短所を持つ各いる:署名によって

  1. 区別:コメントで示唆したよう

    - (void)myFunctionWithA:(AObject *)obj; 
    - (void)myFunctionWithB:(BObject *)obj; 
    
  2. は、タイプNSObject *(またはidのパラメータを宣言します)、関数内の型を問い合わせます。

  3. 上記と同じですが、共通の基底クラスBaseObject *を宣言することによって制約されています。この場合、AObjectBObjectが継承します。
  4. はトランポリン技術と基本クラスを結合:

    - (void)myFunction:(BaseObject *)base { 
        [base myTrampoline:self]; 
    } 
    

    BaseObjectAObjectBObject実装抽象メソッドmyTrampoline:を宣言する。

あなたの問題について詳しく知ることなく、どちらが最善であるかを言うことは不可能です。

+0

ありがとうございます。私は2を選択します。 – arachide

+1

私は個人的にNSObject *の代わりにidを使用したいと思っています。もっと自然な感じです... – gcamp

+0

@gcamp私はそれを2回目です。特にObjective-Cオブジェクトのすべてが 'NSObject *'ではないので(特にこれは比較的まれですが、 'NSProxy *'もあります)。 'id'は' struct objc_object * 'と同義ですが、これはどんなオブジェクトでも機能します。でも、それほど問題はありません。 –

1

パラメータを入力することをお勧めしますが、気分が良い場合は、オブジェクトが実際に必要なことを実行できることをコンパイル時に確認することができます:プロトコルを使用する。

@protocol DoingSomething <NSObject> 
// whatever methods you intend to call on the parameter of that one method 
@end 

//... 
- (void)myFunction:(id<DoingSomething>)param { 
    // only send messages to param that are in <DoingSomething> and <NSObject> 
} 
//... 
関連する問題