所以我们有一个带头文件的库(例如):
公开
私人
当它被导入到应用程序中时,它会抱怨它找不到MyClass.h
。这很公平。其#import
已编入MyCustomClass.h
但尚未隐藏。
所以我把它改成了前瞻性声明@class MyClass
。现在它抱怨我不能使用超级类的前向声明(也很有意义)。
我怎么能绕过这个呢?我需要继承一些东西,但我只希望使用该库的人能够访问子类,而不是超类。
答案 0 :(得分:1)
您正在编写库,并且您希望客户端实例化继承自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都是私有实现。