2013-03-13 74 views
1

所以我們有一個頭文件庫如下(舉例):子類私有類在庫

公共

  • MyCustomClass.h(子類MyClass的)

Private

  • MyClass.h

當這個被導入到應用然而,然後抱怨說,它無法找到MyClass.h。這很公平。它的#import編輯成MyCustomClass.h,但它的隱藏。

因此,我將其更改爲前向類聲明@class MyClass。現在它抱怨我不能使用超類的前向聲明(也是有道理的)。

我該如何解決這個問題呢?我需要繼承某些東西,但我只希望使用該庫的人能夠訪問子類,而不是超類。

+0

可能的重複[在ObjC中,我如何隱藏實現一個超類的方法在子類?](http://stackoverflow.com/questions/7507417/in-objc-how-do-i-hide-implementation- a-superclasss-methods-in-a-subclass) – trojanfoe 2013-03-13 14:15:44

+0

感謝trojanfoe,但我實際上希望隱藏整個類的存在,而不是方法。我希望人們能夠繼承MyCustomClass,並且使用所有的方法,但不是原始MyClass的子類(MyCustomClass覆蓋了你看到的一些方法 - 所以我想強制人們通過MyClass使用MyCustomClass)。 – 2013-03-13 15:35:22

回答

1

您正在編寫一個庫,並且希望客戶端實例化從MyClass繼承的MyCustomClass。但客戶端不應該實例化MyClass。

方法1:您實際上並不需要或想要隱藏MyClass。你只是想避免實例化它的實例。

  • 一)使其構造私人
  • B)創建,創建MyCustomClass的實例的工廠方法。

該工廠可能是MyClass的一部分,或者它可能在其他地方。

@implemenation MyClass 
+ (MyCustomClass*) createWith: (Param*) someData; 

方法2:考慮組成,而不是繼承。讓MyCustomClass 自己 MyClass類型的對象,並讓它做所有的工作:

@implementation MyCustomClass 
@property (nonatomic,strong) MyClass* myClassInstance; 
- (void) doSomething 
{ 
     [self.myClassInstance doSomething]; 
} 

由於客戶無法繼承MyClass的,無論如何,繼承是一個實現細節。當你不需要時不要繼承。

方法3:你確定你真的想公開MyCustomClass嗎?它確實是一個對象,還是它是一個協議?也許你的庫應該公開提供接口,MyClass和MyCustomClass都是私有實現。

+0

ObjC中沒有私人構造函數 – 2013-03-21 21:09:57

+0

你不能讓'init'私人? – 2013-03-21 22:56:30

+0

在ObjC中沒有私有方法。你可以隱藏聲明,但是由於'init'在'NSObject'中定義,你無法做任何事情來隱藏它 – 2013-03-21 23:06:25