2011-09-01 47 views
0

有沒有辦法讓超類中的「私有」方法(不在其頭文件中)仍然能夠從子類訪問這些方法?不在超類的頭文件中的繼承方法

+0

IOW,你想要受保護的方法。 –

+0

是的。但是在ObjC中沒有這樣的構造,我可以將它從(公共)頭文件中隱藏起來。所以我沒有這樣說。 – fabb

+0

我知道。我只是想澄清你想要什麼。 –

回答

3

你可以使用一個自定義類別,例如:

Stuffy.h

// The "official" header file to be used by almost anyone 

@interface Stuffy { 
    int myMember; 
} 

- (void) somePublicMethod; 
@end 

悶+ Secret.h

// The magic header file, which should only be used by knowledgable people 

#import "Stuffy.h" 

@interface Stuffy (Secret) 
    - (void) _pseudoProtectedMethod; 
@end 

Stuffy.m

#import "Stuffy+Secret.h" 

@implementation Stuffy 

- (void) somePublicMethod { 
    // ... 
} 

@end 

@implementation Stuffy (Secret) 

- (void) _pseudoProtectedMethod { 
    // ... 
} 

@end 

的子類現在可以在其.m文件中導入Stuffy.h,並堅持公開API或導入Stuffy+Secret.h並使用半保護的內容。

請注意,Objective-C沒有真實的概念protectedprivate方法。基本上,任何人都可以包括Stuffy+Secret.h並使用在那裏聲明的東西。

+1

Yuck,它的工作原理 - 但仍然...惡作劇! – ColinE

1

你可以「欺騙」幾種方式。除類別之外,您可以簡單地將您的Stuffy指針指向FunnyStuff,併爲其指定一個完整的「另一個@interface」。 (只是不要聲明任何靜力學,也不要做@implementation。)或者是一個小清潔工,將其轉換爲定義您添加的方法的@protocol。 (並且,由於您正在創建一個子類,因此您可以簡單地將該協議添加到您的子類定義中,並避免任何投射。)

請記住,Objective-C不要求@implementation中的每個方法都有在@interface中的相應聲明和方法調用是完全動態的,有效地包括名稱查找。你唯一需要做的就是誘使編譯器允許調用。 (實際上,如果你不介意編譯器的警告,你可以根本不需要聲明。)