Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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_Inheritance - Fatal编程技术网

Objective c 使基类调用子类中的方法

Objective c 使基类调用子类中的方法,objective-c,inheritance,Objective C,Inheritance,作为一名C#/Java程序员,我很难解决以下问题: 有一个基类“B”。在其init方法中,它调用一个方法“SetupStuff”。 对于基类,此方法只是空的 然后是从“B”继承的派生类“D”。 D也实现了“SetupStuff”方法(实际上在那里做了一些事情) 问题是:当我创建一个D对象时,它的“SetupStuff”永远不会被调用。调用B的init方法,然后调用的空“SetupStuff” 我需要做什么才能调用派生类的方法?默认情况下,objective-c中的所有方法都是虚拟的。所以,您只需

作为一名C#/Java程序员,我很难解决以下问题:

有一个基类“B”。在其init方法中,它调用一个方法“SetupStuff”。 对于基类,此方法只是空的

然后是从“B”继承的派生类“D”。 D也实现了“SetupStuff”方法(实际上在那里做了一些事情)

问题是:当我创建一个D对象时,它的“SetupStuff”永远不会被调用。调用B的init方法,然后调用的空“SetupStuff”


我需要做什么才能调用派生类的方法?

默认情况下,objective-c中的所有方法都是虚拟的。所以,您只需在派生类中实现要重写的方法。只是别忘了调用parent方法以确保没有遗漏任何内容

并确保您创建的是D类的实例,而不是B类

[[D alloc] init];

然后应该正确调用重写的方法

是否忘记使用以下命令初始化子方法:

-(void) SetupStuff{ // This is the child class implementation
[super SetupStuff];
}

在objective-c中,您必须手动调用父方法,即使它们正在覆盖先前存在的方法。

如果您试图从初始值设定项内部调用重写,则该方法将不起作用。其原因很容易理解:由于重写属于子类,并且在子类初始化开始之前需要完成超类实例初始化,因此调用派生方法将违反“常规”时的规则方法,则实例的初始化已完成。通常,出于同样的原因,从Java或C#构造函数调用Virtual不是一个好主意。在C++中,调用构造函数中的虚拟化重定向到CONSUNTROBUTROR自己类中的实现(即,在目标C中观察到的同一事物)。

与不允许重写静态方法的C#和Java不同,Objective C允许您提供类方法的特定于类的实现。您可以使用此机制来实现您尝试执行的操作:在派生类中定义类方法,并从基类调用它,如下所示:

@interface TT : NSObject
-(id)init;
@end

@interface Test1 : TT
+(void)doit;
@end

@interface Test2 : TT
+(void)doit;
@end

@implementation Test1
+(void) doit {
    NSLog(@"Test1");
}
@end

@implementation Test2
+(void) doit {
    NSLog(@"Test2");
}
@end

@implementation TT
-(id) init {
    if (self=[super init]) {
        // The "magic" is in the following line:
        [self->isa doit];
    }
    return self;
}
@end
当你打电话的时候

[[Test1 alloc] init];
[[Test2 alloc] init];
你看

Test1
Test2

在日志中。

我认为OP正以另一种方式进行操作:他的超级需要在派生中调用重写。好主意。但是由于这些方法现在是静态的,所以我无法访问实例变量。所以这对我不起作用:-(@Boris)你不可能访问实例变量,因为当你在
[super init]中时
,派生类的实例变量尚未初始化。但是,如果您需要访问基类的变量,可以很容易地安排:您可以将其
self
指针传递到静态方法,它将能够访问基类的IVAR。嗯,我无法使您的代码正常工作。编译器一直在运行g me:“类方法+doit not found”。当执行代码时,应用程序会在调用时崩溃……你可以只执行
[self Class]
,而不是
self->isa
直接访问
self->isa
现在已经过时。请看以下内容: