私はのUIViewController Aを持っていると私はAを持っていると 場合はそのBのサブクラスでは、私がAをオーバーライドするBのメソッドを呼び出したい、私はそれをどのように行うのですか?
メソッドを呼び出すだけです。オブジェクトが実際にBのインスタンスである場合、そのメソッドのBのバージョンが実行されます。オブジェクトがAのインスタンスとしてインスタンス化された場合、メソッドのAバージョンが呼び出されます。自分が本当にそれを理解するためにそれを試してみてください:
@interface A : NSObject
{}
@end
@implementation A
- (void)whoAmI
{
NSLog(@"I'm an A\n);
}
@end
@interface B : A
@end
@implementation B
- (void)whoAmI
{
NSLog(@"I'm a B\n");
}
@end
//...
A *a = [[A alloc] init];
A *b = [[B alloc] init];
B *c = [[A alloc] init];
B *d = [[B alloc] init];
[a whoAmI]; // this will log "I'm an A"
[b whoAmI]; // this will log "I'm a B"
[c whoAmI]; // this will log "I'm an A"
[d whoAmI]; // this will log "I'm a B"
サブクラスの実装では、あなたがsuper
キーワードを使用しての代わりself
によってスーパークラスのメソッドを呼び出すことができます。これは、同じメソッドのオーバーライドでは、主に便利です
[super whoAmI];
:
[self whoAmI];
か、それがこのようなスーパークラスの実装です呼び出すことができます。たとえば、Bのもう一つの方法は、Bさん-whoAmI
このように呼び出すことができます継承された動作を保持することができますが、追加することができます。 Bさん-whoAmI
は、次のように実装することができます。その場合
- (void)whoAmI
{
NSLog(@"I'm a B\n");
[super whoAmI];
}
、スニペットは、上記のコメントに示すような結果を持っているでしょう:
[a whoAmI]; // this will log "I'm an A"
[b whoAmI]; // this will log "I'm a B" followed by "I'm an A"
[c whoAmI]; // this will log "I'm an A"
[d whoAmI]; // this will log "I'm a B" followed by "I'm an A"
それがどのように理解するための基本的だとして、本当にこのようなものを理解することが重要ですさまざまな種類のオブジェクトを扱うことができます。だから、このような愚かな小さなサンプルプログラムを作成し、あなたがそれを持っていることを確認するまで質問を続けていく時間を取ってください。
私はあなたが何を意味しているのかよく分かりません。あなたのコードを投稿して、あなたが何をしようとしているのを見ることができますか? –
は、私が意味するものを1行の文に追加したものです。 – xonegirlz
サブクラス化のポイントは、スーパークラスのメソッドをオーバーライドするか、新しいメソッドを追加することです。したがって、サブクラスのインスタンスを作成し、そのメソッドを呼び出すことになります。スーパークラスをサブクラス化する理由は何ですか? – mbh