如何在同一个类中调用方法

时间:2013-09-11 06:46:54

标签: objective-c

我有一个超类,SuperClassYeh和一个子类SubClassYeh。我在SuperClassYeh中有方法inheritTest,我在SubClassYeh中覆盖inheritTest。我通过在SubClassYeh中调用方法testSuperAndSelf来启动程序。此方法将在SuperClassYeh中调用另一个方法fromYEH。在fromYEH中,我想在SuperClassYeh中调用inheritTest。我怎么做?使用[self inheritTest]调用SubClassYeh中的inheritTest,而不是SuperClassYeh。

这是启动整个运行的代码片段

SubClassYeh *testing = [[SubClassYeh alloc] init];
[testing testSuperAndSelf];

这是SuperClassYeh

的代码片段
- (void) fromYEH
{
    [self inheritTest]; //Calls the inheritTest in SubClassYeh, not SuperClassYeh
}

- (void) inheritTest
{
    NSLog(@"Testing Indicator. Inside SuperClassYEH inheritTest");
}

这是SubClassYeh

的代码片段
- (void) inheritTest
{
    NSLog(@"Testing Indicator. Inside SubClassYeh inheritTest");
}

- (void) testSuperAndSelf
{
    [super fromYEH];  
}

5 个答案:

答案 0 :(得分:5)

你不能,,这是Objective-C中继承的预期行为。

如果selfSubClassYeh的实例,那么

[self inheritTest]

调用SubClassYeh的{​​{1}}实现(如果有的话), 无论从哪里发送消息(子类或超类)。

inheritTest[super fromYEH]之间的唯一区别是查找 因为“fromYEH”消息从超类开始,但它不会改变事实 [self fromYEH]self的实例。

并且您无法阻止在Objective-C中覆盖方法 (请参阅How to avoid superclass methods getting overridden by sub class in objective - c或其他关于该主题的Q& A)。

在超类中唯一可以做的就是选择方法名称 那些未被覆盖的意外,例如通过为方法名称添加前缀 使用类名称,如下所示:https://stackoverflow.com/a/17209309/1187415

答案 1 :(得分:0)

如果你可以从SubClassYeh拨打[super fromYEH],那么以同样的方式调用[super inheritTest]有什么问题?

答案 2 :(得分:0)

即使这是一个非常奇怪的行为,你可以尝试这样的事情(实际上没有测试它)

- (void) fromYEH
{
    bool isSubClass = [self isKindOfClass:[SubClassYeh class]];
    if(isSubClass == YES)
    {
        [super performSelector:@selector(inheritTest)];
    }
    else
    {
        [self inheritTest];
    }
}

无论如何,即使这段代码真的有用,我仍然认为这是非常糟糕的做法。


修改

在XCode中检查了这一点。它不会做诀窍=)所以赞成马丁的回答=)

答案 3 :(得分:0)

我找到了解决方案。不要在[super fromYeh]中调用testSuperAndSelf,而是将接收器更改为超类。使用[[[[SubClassYeh superclass] alloc] init] fromYEH]。在方法fromYEH内,inheritTest的{​​{1}}将被调用 以下是SuperClassYEH中方法testSuperAndSelf的代码片段。其他代码保持不变。

SubClassYeh

答案 4 :(得分:0)

仅供记录......

如果从不同的角度来看,你想要做的事情并不像你想象的那么困难。

您所要做的就是定义一个C函数并调用它。

- (void) fromYEH
{
    inheritTest(self); //Calls the inheritTest() in SuperClassYeh
}

void inheritTest(SuperClassYeh *self)
{
    NSLog(@"Testing Indicator. Inside SuperClassYEH inheritTest");
}    

- (void) inheritTest
{
    inheritTest(self);
}

(我喜欢名字......;)