所以我们有一个包含如下头文件的库(例如):
上市
- MyCustomClass.h(子类 MyClass)
私人的
- 我的类.h
当它被导入应用程序时,它会抱怨它找不到MyClass.h
. 这很公平。它被#import
编入MyCustomClass.h
并隐藏起来。
所以我把它改成了一个前向类声明@class MyClass
。现在它抱怨我不能对超类使用前向声明(这也是有道理的)。
那我该如何解决呢?我需要对某些东西进行子类化,但我只希望使用该库的人能够访问子类,而不是超类。
所以我们有一个包含如下头文件的库(例如):
上市
私人的
当它被导入应用程序时,它会抱怨它找不到MyClass.h
. 这很公平。它被#import
编入MyCustomClass.h
并隐藏起来。
所以我把它改成了一个前向类声明@class MyClass
。现在它抱怨我不能对超类使用前向声明(这也是有道理的)。
那我该如何解决呢?我需要对某些东西进行子类化,但我只希望使用该库的人能够访问子类,而不是超类。
您正在编写一个库,并且您希望客户端实例化继承自 MyClass 的 MyCustomClass。但是客户端永远不应该实例化 MyClass。
方法 1:您实际上不需要或不想隐藏 MyClass。您只想避免实例化它的实例。
工厂可能是 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 都是私有实现。