4

メソッドが、単一のクラスで宣言されたメソッドのサブセットにアクセスできるようにしたい。明らかに、これはプロトコルによって実現できます。

メソッド サブセットは HouseProtocol で宣言され、クラス House はそのメソッドを実装します。

@protocol HouseProtocol <NSObject>
-(void) foo;
@end

.

@interface House : NSObject <HouseProtocol>
-(void) foo;
-(void) bar;
@end

別のクラスの別の場所で、HouseProtocol 引数を取るメソッドが定義されています。

-(void) somemethod:(id<HouseProtocol>)hp;

このメソッドは、house のメソッドを使用する必要がありますが、HouseProtocol でアクセスできるメソッドのみを使用してください。メソッド foo を意味しますが、メソッド バーは意味しません。

上記は正しいですか? また、somemethod 内で foo メソッドがどのように呼び出されるのですか? 作業コードを高く評価しました。

4

1 に答える 1

8

正解です。のメソッドの呼び出しhpは通常どおり機能します。

- (void) somemethod: (id<HouseProtocol>) hp
{
    [hp foo];
}

プロトコルが本当に必要ない場合(コードが本当に単純で、プロトコルを書くのは明らかにやり過ぎになる場合など)、単純に次のidタイプを使用できることに注意してください。

- (void) somemethod: (id) hp
{
    [hp foo];
}

この場合の唯一の落とし穴は、コンパイラがそれ-fooが存在することを認識しなければならないということです。

hp質問のタイトルから判断すると、混乱したのは、変数のタイプについての考え方です。id<HouseProtocol>プロトコルではなく、「実装するものHouseProtocol」です。hpこれが、ある種のオブジェクトであるため、通常の方法でメソッドを呼び出すことができる理由です。

于 2012-08-13T09:57:04.297 に答える