Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Objective-C子类设置_Objective C_Oop_Subclass_Init - Fatal编程技术网

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

我有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_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
本身中执行设置即可。这就是它的目的