2012-04-13 62 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 
{ 
} 

而且它的工作原理確定,當我呼叫方法在ClassA

+0

張貼一些代碼,沒有它,你的問題不清楚 – 2012-04-13 11:00:42

+0

@MichałZygar,這是相當清楚。我在類中有一個方法,實現在它的超類中。 – yoyosir 2012-04-13 11:28:56

+1

我不這麼認爲。看起來你在那裏建造了一些奇怪的結構。無論如何。爲什麼你有在超類中實現並在派生類中聲明的方法?你爲什麼不把這個方法的聲明放在超類頭文件中?然後你可以直接從派生類中調用這個方法。 – 2012-04-13 11:34:29

回答

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的,你可以調用

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

然後method在CLASSA感謝可供繼承來自ClassB。

+0

你的意思是沒有辦法將該方法放在'.m'文件中?但我的應用程序實際上工作。這是爲什麼? – yoyosir 2012-04-13 12:21:17

+0

嗯,它正在工作,因爲方法在那裏定義(雖然沒有delcared)。但是,如果您在.m文件中放入方法聲明,則此聲明將僅在此.m文件中可見,並在其他位置隱藏(未聲明)。所以你現在擁有的是:來自classB的方法被調用,但它沒有被聲明(它就像一個幸運的鏡頭)。 classA中的方法是聲明的但沒有定義(沒有實現),所以它在編譯器中缺少。 – 2012-04-13 12:32:18

+0

有時它是不能做的,例如當你當A類有動態屬性,你想要使用。 – badeleux 2013-07-24 07:27:47

2

你總是可以實現的方法,無論如何,和調用超級方法 -

-(void)doMyThing { 

    [super doMyThing]; 

    // do nothing 

} 
+0

但它在.m文件中定義。編譯器沒有看到它。 – yoyosir 2012-04-13 11:27:14

+1

不能沒有更多的代碼 – SomaMan 2012-04-13 11:40:25

+0

我添加了一些代碼。 – yoyosir 2012-04-13 11:59:51

0

聽起來你已經宣佈.h文件的方法時,你不應該有?或者.h文件中可能缺少@end。

你不會給我們太多的繼續。我們可以從.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 

ClassB.m

@interface ClassB 
@end 

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

我添加了一些代碼。 – yoyosir 2012-04-13 11:59:59