在库中对私有类进行子类化

时间:2013-03-13 14:07:46

标签: ios objective-c xcode

所以我们有一个带头文件的库(例如):

公开

  • MyCustomClass.h(子类MyClass)

私人

  • MyClass.h

当它被导入到应用程序中时,它会抱怨它找不到MyClass.h。这很公平。其#import已编入MyCustomClass.h但尚未隐藏。

所以我把它改成了前瞻性声明@class MyClass。现在它抱怨我不能使用超级类的前向声明(也很有意义)。

我怎么能绕过这个呢?我需要继承一些东西,但我只希望使用该库的人能够访问子类,而不是超类。

1 个答案:

答案 0 :(得分:1)

您正在编写库,并且您希望客户端实例化继承自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都是私有实现。