子类化库中的私有类
Posted
技术标签:
【中文标题】子类化库中的私有类【英文标题】:Subclassing private classes in a library 【发布时间】:2013-03-13 14:07:46 【问题描述】:所以我们有一个包含如下头文件的库(例如):
公开
MyCustomClass.h(子类 MyClass)私人
MyClass.h当它被导入应用程序时,它会抱怨它找不到MyClass.h
。这很公平。它的 #import
ed 到 MyCustomClass.h
中,但它是隐藏的。
所以我把它改成了前向类声明@class MyClass
。现在它抱怨我不能对超类使用前向声明(这也是有道理的)。
那我该如何解决呢?我需要对某些东西进行子类化,但我只希望使用该库的人能够访问子类,而不是超类。
【问题讨论】:
In ObjC, how do I hide implementation a superclass's methods in a subclass? 的可能重复项 感谢 ***foe,但我实际上希望隐藏该类的存在而不是方法。我希望人们能够继承 MyCustomClass,并使用所有方法,但不能继承原始 MyClass(MyCustomClass 会覆盖您看到的一些方法 - 所以我想强制人们使用 MyCustomClass 而不是 MyClass)。 【参考方案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 都是私有实现。
【讨论】:
ObjC 中没有私有构造函数 你不能将init
设为私有吗?
ObjC 中没有私有方法。你可以隐藏声明,但由于init
是在NSObject
中定义的,所以你无法隐藏它
方法 2 是我们解决此问题的方法。它有点“混乱”——感觉不对,但这是我们真正解决这个问题的唯一方法。 :) 非常感谢!
组合比继承更好。感觉更混乱,但事实并非如此。为唯一答案的情况保留继承。以上是关于子类化库中的私有类的主要内容,如果未能解决你的问题,请参考以下文章