Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在库中对私有类进行子类化_Ios_Objective C_Xcode - Fatal编程技术网

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实例的工厂方法
工厂可能是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都是私有实现

您正在编写一个库,希望客户端实例化从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都是私有实现

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是我们解决此问题的方法。这有点“混乱”——感觉不对,但这是我们真正能解决这个问题的唯一方法非常感谢!组合比继承好。感觉更混乱,但事实并非如此。将继承保留为唯一答案的情况。