Ios 在库中对私有类进行子类化
因此,我们有一个具有如下头文件的库(例如): 公开Ios 在库中对私有类进行子类化,ios,objective-c,xcode,Ios,Objective C,Xcode,因此,我们有一个具有如下头文件的库(例如): 公开 MyCustomClass.h(子类MyClass) 私人 MyClass.h 然而,当将其导入应用程序时,它会抱怨找不到MyClass.h。这很公平。它的#import被导入到MyCustomClass.h中,但它却被隐藏 所以我把它改为转发类声明@classmyclass。现在它抱怨我不能为超类使用转发声明(也有意义) 那我怎么才能避开这件事呢?我需要对某些内容进行子类化,但我只希望使用库的用户能够访问子类,而不是超级类。您正在编写
- MyCustomClass.h(子类MyClass)
- MyClass.h
MyClass.h
。这很公平。它的#import
被导入到MyCustomClass.h
中,但它却被隐藏
所以我把它改为转发类声明@classmyclass
。现在它抱怨我不能为超类使用转发声明(也有意义)
那我怎么才能避开这件事呢?我需要对某些内容进行子类化,但我只希望使用库的用户能够访问子类,而不是超级类。您正在编写库,并且希望客户端实例化从MyClass继承的MyCustomClass。但是客户端不应该实例化MyClass 方法1:您实际上不需要或不想隐藏MyClass。您只想避免实例化它的实例
- a) 使其构造函数私有
- b) 创建创建MyCustomClass实例的工厂方法
@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都是私有实现 您正在编写一个库,希望客户端实例化从MyClass继承的MyCustomClass。但是客户端不应该实例化MyClass 方法1:您实际上不需要或不想隐藏MyClass。您只想避免实例化它的实例
- a) 使其构造函数私有
- b) 创建创建MyCustomClass实例的工厂方法
@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都是私有实现 Thank特洛伊木马可能与Thank特洛伊木马相同,但我实际上是想隐藏该类的存在,而不是方法。我希望人们能够对MyCustomClass进行子类化,并使用所有方法,但不能对原始MyClass进行子类化(MyCustomClass会覆盖您看到的一些方法-因此我想强制人们使用MyCustomClass而不是MyClass)。Thank特洛伊木马可能重复,但我实际上是想隐藏这个类的存在,而不是方法。我希望人们能够对MyCustomClass进行子类化,并使用所有方法,但不能对原始MyClass进行子类化(MyCustomClass覆盖了您看到的一些方法-因此我想强制人们在MyClass上使用MyCustomClass)。ObjC中没有私有构造函数。您不能将
init
private吗?ObjC中没有私有方法。您可以隐藏声明,但由于init
是在NSObject
中定义的,因此您无法隐藏它。方法2是我们解决此问题的方法。这有点“混乱”——感觉不对,但这是我们真正能解决这个问题的唯一方法非常感谢!组合比继承好。感觉更混乱,但事实并非如此。将继承保留为唯一答案的情况。ObjC中没有私有构造函数。不能将init
private吗?ObjC中没有私有方法。您可以隐藏声明,但由于init
是在NSObject
中定义的,因此您无法隐藏它。方法2是我们解决此问题的方法。这有点“混乱”——感觉不对,但这是我们真正能解决这个问题的唯一方法非常感谢!组合比继承好。感觉更混乱,但事实并非如此。将继承保留为唯一答案的情况。