簡體   English   中英

在庫中對私有類進行子類化

[英]Subclassing private classes in a library

因此,我們有一個帶有以下頭文件的庫(例如):

上市

  • MyCustomClass.h(MyClass的子類)

私人的

  • MyClass.h

但是,當將其導入到應用程序時,它會抱怨找不到MyClass.h 這很公平。 它的#import導入MyCustomClass.h ,但尚未隱藏。

所以我將其更改為前向類聲明@class MyClass 現在它抱怨我不能對超類使用前向聲明(也很有意義)。

那我該如何解決呢? 我需要對某些子類進行子類化,但是我只希望使用該庫的人可以訪問子類,而不是父類。

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

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

  • a)將其構造函數設為私有
  • 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都是私有實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM