2012-02-03 17 views
0

を呼び出すので、私が作成したUIViewControllerをサブクラス化しました。問題は、作成しているクラスがスーパークラスであれば、サブクラス化されたメソッドを使用してメソッドを呼び出すことができるようにする方法があるかどうかです。私は哺乳類に犬の行動を呼びかけることと同じように、これはばかげていることを知っています。しかし、これを行う前に、私は実際にその哺乳動物が犬であることを最初に確認しています。そうでなければ、私はそれを呼ぶことはありません。これは悪いことですか?もしそうでなければ、どうすればそのようなことができますか?スーパークラスをサブクラスにキャストしてからメソッド呼び出しを実行しようとしましたが、機能しません。何かご意見は?強制的にUIViewControllerサブクラスメソッド

私は何をしようとしています。私はUIViewController AとそのBのサブクラスを持っています。私はAを持っていて、AをオーバーライドするBのメソッドを呼びたい場合、どうすればいいですか?私はこれが明確であることを願っています

+0

私はあなたが何を意味しているのかよく分かりません。あなたのコードを投稿して、あなたが何をしようとしているのを見ることができますか? –

+0

は、私が意味するものを1行の文に追加したものです。 – xonegirlz

+0

サブクラス化のポイントは、スーパークラスのメソッドをオーバーライドするか、新しいメソッドを追加することです。したがって、サブクラスのインスタンスを作成し、そのメソッドを呼び出すことになります。スーパークラスをサブクラス化する理由は何ですか? – mbh

答えて

4

オブジェクトを宣言する方法と実際に何を宣言するかには違いがあります。この例で考えてみましょう :ここ

Mammal *mammal = [[Dog alloc] init]; //Dog is a subclass of Mammal 

を、あなたは実際には、専門Dogクラスのインスタンスを指すMammalオブジェクトへのポインタを持っています。これは哺乳動物が犬が持つ全ての方法を持っているため有効です。

一部Mammalインスタンスはこのように、isKindOfClass:を使用することにより、実際にDogであるかどうかをチェックすることができます:

if ([mammal isKindOfClass:[Dog class]]) { 
    [(Dog *)mammal bark]; 
} 

これは完全に有効です。しかしmammal[[Mammal alloc] init]で作成した場合は、Dogクラスのチェックが失敗し、Dogのメソッドだけを呼び出すことはできません。チェックをしないと、実際にクラッシュするでしょう。キャストはオブジェクトを決して変更しないため、コンパイラに「私がやっていることを知っています。私に警告しないでください」と伝えます。

1

私はあなたが下にではなく、上の階層に行くことができると信じています。したがって、基本的には、クラスからスーパークラスを呼び出すことはできますが、サブクラスは呼び出すことはできません。スーパークラスに自身の参照を渡すことによってサブクラスを初期化しない限り、そこには関係はありません。

これはあなたが探しているものですか?

+0

hmm ..それはスーパークラスとして初期化します – xonegirlz

+0

私はこれが何を意味するのか分かりません。スーパークラスはサブクラスを認識しません。 –

0

私はの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" 

それがどのように理解するための基本的だとして、本当にこのようなものを理解することが重要ですさまざまな種類のオブジェクトを扱うことができます。だから、このような愚かな小さなサンプルプログラムを作成し、あなたがそれを持っていることを確認するまで質問を続けていく時間を取ってください。

関連する問題