Objective-C子类设置
我有3门Objective-C课程:Objective-C子类设置,objective-c,oop,subclass,init,Objective C,Oop,Subclass,Init,我有3门Objective-C课程: Animal - a subclass of NSObject Feline - a subclass of Animal Cat - subclass of Feline 这三个类中的每一个都实现(我认为是)自己的私有方法(-private\u Setup),用于安装: e、 g.动物: -(instancetype)init { self = [super init]; if (self) { [self private
Animal - a subclass of NSObject
Feline - a subclass of Animal
Cat - subclass of Feline
这三个类中的每一个都实现(我认为是)自己的私有方法(-private\u Setup),用于安装:
e、 g.动物:
-(instancetype)init
{
self = [super init];
if (self) {
[self private_Setup];
}
return self;
}
-(instancetype)init
{
self = [super init];
if (self) {
[self setupAnimal];
}
return self;
}
猫科动物和猫科动物也一样
在运行时提供了所需类的列表,因此我将根据类名列表创建各种类的实例
e、 g
问题:
如果我创建了一个Cat实例,那么继承链中的每个步骤都会多次调用-private_Setup。例如,Cat的调用链:
-[Cat init]
-[Feline init]
-[Animal init]
-[Cat private_Setup] // First!
然后,从:
-[Feline init]
-[Cat private_Setup] // Second!
-[Cat init]
-[Cat private_Setup] // Third!
然后,从:
-[Feline init]
-[Cat private_Setup] // Second!
-[Cat init]
-[Cat private_Setup] // Third!
因此,我认为是每个类私有的方法,在层次结构中的每个init之后被调用
有人能告诉我如何解决这个问题或重新设计我的设置策略吗?谢谢
[为清晰起见,已编辑、添加]
在继承的每个级别上都需要某种形式的设置,以提供特定于该级别的数据。e、 g.Cat特定设置
因此,我需要的是将猫对象完全设置为动物、猫和猫
我想一种方法是在每个级别上使用不同的设置方法名称。e、 动物,猫,猫
e、 g.动物:
-(instancetype)init
{
self = [super init];
if (self) {
[self private_Setup];
}
return self;
}
-(instancetype)init
{
self = [super init];
if (self) {
[self setupAnimal];
}
return self;
}
//在猫科动物中:
-(instancetype)init
{
self = [super init];
if (self) {
[self setupFeline];
}
return self;
}
//在Cat中:
-(instancetype)init
{
self = [super init];
if (self) {
[self setupCat];
}
return self;
}
有比这个更好、更受欢迎的设计吗?我认为你应该调用
private\u Setup
方法,只调用Animal
的init
中的一次。这就是全部。在所有子类中实现,在超级阿拉斯加中只调用一次
您的意思是,每个子类都需要不同形式的设置。当然这就是为什么要在每个子类中实现
private\u Setup
。实现,就像您需要为每个特定的子类实现一样。这叫做覆盖。内部重写方法调用[超级私有\u设置]
。你会得到你所需要的 如果我理解正确,您是在暗示对private_Setup的调用也发生在所有子类的init方法中
从除top(例如Animal)init方法之外的所有方法中删除对private_Setup的调用。只要所有人都调用
[super init]
,你就只会得到一个对private\u Setup的调用。你说的是super init
和super的init
调用private\u Setup
,那么你为什么感到惊讶呢
我猜您会感到惊讶,因为您希望链中的每个init
调用自己的类的private\u设置。但需要理解的是,self
的含义会根据启动链的实例的原始类而变化(多态性)
因此,例如,如果在初始化Cat的过程中从Animal的init
调用self private\u Setup
,则将调用Cat的private\u Setup
。因此,根据您所做的安排,在初始化Cat时,Cat的private\u Setup
将被调用三次,而不会调用任何其他设置
解决方法很简单:不要使用额外的方法。让初始值设定项调用任何方法都是一个重大错误(而您遇到的问题正是这是一个错误的原因之一)。相反,只需在init
本身中执行设置即可。这就是它的目的