2011-08-31 71 views
1

用於ObjC對象常見的例子是這樣的(爲頭文件):ObjC:我必須在頭文件中指定繼承嗎?

@interface A: B { 
    int x; 
    int y; 
} 
@end 

是否有可能避免在頭文件中的繼承規範(即B這裏)?


以我的情況下,框架的一個定義了類A和另一個(子)框架B定義的類B(這是NSView子類)。鏈接到B.在我的應用程序中,我鏈接到A,我不需要知道關於B的任何內容,只是它是NSView的子類。我想避免鏈接到B.但是,如果B在頭文件中,我想我無法避免它,這就是爲什麼我問如何避免它。

回答

0

沒有。

您必須經常使用類集羣解決這個問題,持有私有實現或創建對象工廠。那麼你可以最小化跨模塊的依賴關係。

如果您打算使用它(例如創建一個實例),您仍然需要在某個階段鏈接到子庫。

更新 - 展示私有實現

私人實現可以是完全不透明的。如果你揭露他們,這裏是實現私有實現這都是可見的客戶有兩種方式:通過協議

:通過基地

// MONDrawProtocol.h 
// zero linkage required 
// needs to be visible to adopt 
// may be forwarded 
@protocol MONDrawProtocol 
- (void)drawView:(NSView *)view inRect:(NSRect)rect; 
@end 

// MONView.h 
@protocol MONDrawProtocol; 

@interface MONView : NSView 
{ 
    NSObject<MONDrawProtocol>* drawer; 
} 

@end 

// MONView.m 

#include "MONDrawProtocol.h" 

@implementation MONView 

- (void)drawRect:(NSRect)rect 
{ 
    [self.drawer drawView:self inRect:rect]; 
} 

@end 

// MONDrawer.h 
// base needs to be visible to subclass and types which use MONDrawer 
// may be forwarded 
@interface MONDrawer : NSObject 
- (void)drawView:(NSView *)view inRect:(NSRect)rect; 
@end 

// MONView.h 
@class MONDrawer; 
@interface MONView : NSView 
{ 
    MONDrawer * drawer; 
} 

@end 

// MONView.m 

#include "MONDrawer.h" 

@implementation MONView 

- (void)drawRect:(NSRect)rect 
{ 
    [self.drawer drawView:self inRect:rect]; 
} 

@end 
+0

「私有實現」是什麼意思?也許這正是我想要的/在這裏要求的?看到我自己的答案爲我的當前解決方案,它工作得很好。 – Albert

+0

@Albert更新。你的答案使用工廠;工廠經常被使用,當你必須派生。 – justin

+0

這看起來很複雜。畢竟,我仍然想擁有那個'NSView'。爲什麼不使用我在回答中提出的建議?我無法真正看到您的解決方案的優勢。 – Albert

1

不需要。您必須爲任何子類指定超類。請問爲什麼你會想要做這樣的事情?

+0

超類屬於另一個獨立(子)框架,我不需要鏈接到其他地方。現在,我只鏈接到定義類本身的框架。 – Albert

+1

@Albert:如果您使用在該框架中定義的類(其中包括在其他地方定義的子類,因爲它們部分由其超類定義),則需要在框架中進行鏈接。沒有辦法繞過它。 – Chuck

+0

這是一件奇怪的事情想要做,你想要的框架功能的工作,但你不想要使用它?是你的問題,你只對上課感興趣,你不喜歡你必須包括其他所有的框架?或者你想要在一個框架中繼承一個類,這個框架還不可用(它正在被其他人開發),在這種情況下,你可以爲類創建一個臨時宏,這個類可以創建一個NSObject類或NSView類。 –

0

如果你沒有在接口中指定超類,那麼你的類是一個根類。這意味着它不會從任何其他類繼承,因此它負責提供它自己的必需方法的實現(大部分由NSObject類和協議定義)。由於這不是一項簡單的任務,所以非常鼓勵您從提供這些方法的其他類繼承。

+0

我不希望它成爲一個根類。如果'NSObject'是一個超類,那很好。這只是一個例子。我稍微擴展了我的問題,使其更加清晰。 – Albert

0

可以呀,跟你也將失去ALLOC,初始化等,這讓你寫你自己的alloc,init和其他的東西這是那裏的NSObject

+0

是不是可以重用所有的實現?我想要繼承,我只是不想在頭文件中指定它。 – Albert

+0

我不認爲這是可能的。我能看到的唯一方法是獲得NSObject(或任何您想要繼承的類)的副本.h和.m文件,並將其重命名爲您需要的類並繼續。在其他所有情況下,您將使用兩種不同的實例,這可能不會給您想要的結果。 – Saran

0

你就不能包括的默認實現你從A的頭部本身繼承的類的模擬版本?不知道這是否會導致問題,但它可以讓你清理一下你的鏈接需求。 B-new可以成爲B'Original的一個類別

0

我現在有一個解決方案。相反,提供一流的,我只是提供這樣的功能:

NSView* allocA(); 

內部框架中的A,AB一個子類。

1

您的應用程序需要B的代碼,因此您必須鏈接到B的框架,或者將B框架編譯到您的A框架中。無論哪種方式,您都不能使用A的實例,而不使用B的代碼,並且您必須在B標頭中包含B的標題。

+0

不,它不。看到我自己的答案作爲可能的解決方案。此解決方案不需要「B」的代碼,也不需要與B的任何鏈接。 – Albert

相關問題