子类化库中的私有类

Posted

技术标签:

【中文标题】子类化库中的私有类【英文标题】:Subclassing private classes in a library 【发布时间】:2013-03-13 14:07:46 【问题描述】:

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

公开

MyCustomClass.h(子类 MyClass)

私人

MyClass.h

当它被导入应用程序时,它会抱怨它找不到MyClass.h。这很公平。它的 #imported 到 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 是我们解决此问题的方法。它有点“混乱”——感觉不对,但这是我们真正解决这个问题的唯一方法。 :) 非常感谢! 组合比继承更好。感觉更混乱,但事实并非如此。为唯一答案的情况保留继承。

以上是关于子类化库中的私有类的主要内容,如果未能解决你的问题,请参考以下文章

关于java中 子类 可否通过向上转型,调用父类私有成员方法

08私有化MRO顺序

JAVA中子类能不能继承父类的私有属性和方法?

子类真的继承私有成员变量吗?

从子类访问父类的私有实例变量?

子类如何访问父类