2012-04-13 5 views
0

私はそのスーパーメソッドで実装されたメソッドを持っています。私のプログラムを実行するとき。それはうまく動作します。この警告はどのようにして抑制しますか?ちなみに、両方のメソッドは '.m'ファイルにあります。Xcodeで "不完全な実装"を抑制する方法?(継承)

コードは次のようである:

ClassA.m

@interface ClassA() 
- (void)method; 
@end 

ClassA.h

@interface ClassA : ClassB 
@end 

ClassB.m

@interface ClassB() 
@end 
@implementation ClassB 
- (void)method 
{ 
} 

そしてとき、私はOK作品ClassAの呼び出しメソッド

+0

投稿なしコードなし、ご質問が不明 –

+0

@MichałZygar、それは明らかです。クラスにメソッドがあり、その実装はスーパークラスにあります。 – yoyosir

+1

私はそうは思わない。そこにいくつかの奇妙な構造を建てたようです。とにかく。なぜあなたはスーパークラスで実装され、派生クラスで宣言されたメソッドを持っていますか?なぜこのメソッドの宣言をスーパークラスのヘッダーファイルに入れないのですか?次に、派生クラスから直接このメソッドを呼び出すことができます。 –

答えて

0

。人気の建設が持っていることです。

ClassB.h

@interface ClassB 
- (void)method; 
@end 

ClassB.m

@interface ClassB() 
@end 
@implementation ClassB 
- (void)method 
{ 
    //do nothing or even assert false 
} 
@end 

ClassA.h

@interface ClassA : ClassB 
@end 

ClassA.m

@interface ClassA() 
@end 
@implementation ClassA 
- (void)method 
{ 
    //do your stuff here 
} 
@end 

これはメソッドオーバーライドと呼ばれています。しかし、私が正しくあなたが持っているべきで達成しようとしているかを理解場合:

ClassB.h

@interface ClassB 
- (void)method; 
@end 

ClassBの。メートル

@interface ClassB() 
@end 
@implementation ClassB 
- (void)method 
{ 
    //do your stuff here 
} 
@end 

ClassA.h

@interface ClassA : ClassB 
@end 

そして、そこにClassAと台無しにする必要はありません、あなたはその後method継承するクラスAのおかげで利用可能です

ClassA *o=[[ClassA alloc ] init]; 
[o method]; 

を呼び出すことができますClassBから。

+0

「.m」ファイルにメソッドを入れる方法がないことを意味しますか?しかし、私のアプリは実際に働いています。何故ですか? – yoyosir

+0

メソッドがそこに定義されているので、(delcaredではなく)うまくいきます。しかし、.mファイルにメソッド宣言を置くと、この宣言はこの.mファイルにのみ表示され、他の場所では隠されています(宣言されていません)。だからあなたが今持っているのは:classBのメソッドが呼び出されますが、宣言されていません(これは幸運なショットのようなものです)。 classAのメソッドは宣言されていますが、定義されていない(実装されていません)ので、コンパイラにはありません。 –

+0

クラスAに動的プロパティが設定されている場合など、使用したい場合など、時にはそれを行うことができません。 – badeleux

2

あなたはいつもとにかくメソッドを実装し、スーパーメソッドを呼び出すことができます - あなたが持っていなければならないときは、.hファイルにメソッドを宣言しているよう

-(void)doMyThing { 

    [super doMyThing]; 

    // do nothing 

} 
+0

しかし.mファイルで定義されています。コンパイラはそれを見ません。 – yoyosir

+1

コードなしではわかりません – SomaMan

+0

私はいくつかのコードを追加しました。 – yoyosir

0

サウンズ?あるいは、@endが.hファイルにないかもしれません。

あなたは私たちに多くを与えているわけではありません。 .hと.mの完全なコードを確認できますか?あなたのコードサンプルを読んだ


、以下を試してみてください。

ClassA.h

@interface ClassA : ClassB 
//ClassB inherits from Class A, so we define 'method' in Class B 
//ClassA knows about 'method' by inheritance from class B, 
//so 'method' doesn't need to be defined here. 

//doStuff will be the method that calls 'method' 
- (void)doStuff; 
@end 

ClassA.m

@interface ClassA 
@end 

@implementation ClassA 
- (void)doStuff 
{ 
    //Call 'Method'  
    [self method]; 
} 
@end 

ClassB.h

@interface ClassB 
//Define 'method' which will be inherited by ClassA 
- (void)method; 
@end 

あなたはそれがcompletly間違って持ってClassB.m

@interface ClassB 
@end 

@implementation ClassB 
- (void)method 
{ 
    //'method' does it's thing  
    NSLog(@"Method has been Called"); 
} 
@end 
+0

私はいくつかのコードを追加しました。 – yoyosir

関連する問題