1

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

上市

  • MyCustomClass.h(子类 MyClass)

私人的

  • 我的类.h

当它被导入应用程序时,它会抱怨它找不到MyClass.h. 这很公平。它被#import编入MyCustomClass.h并隐藏起来。

所以我把它改成了一个前向类声明@class MyClass。现在它抱怨我不能对超类使用前向声明(这也是有道理的)。

那我该如何解决呢?我需要对某些东西进行子类化,但我只希望使用该库的人能够访问子类,而不是超类。

4

1 回答 1

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 都是私有实现。

于 2013-03-21T20:28:33.190 回答