0

我有一个超类 SuperClassYeh 和一个子类 SubClassYeh。inheritTest我在 SuperClassYeh 中有方法,我inheritTest在 SubClassYeh 中覆盖。我通过调用testSuperAndSelfSubClassYeh 中的方法启动程序运行。此方法将调用fromYEHSuperClassYeh 中的另一个方法。在fromYEH,我想打电话给inheritTestSuperClassYeh。我怎么做?使用[self inheritTest]调用inheritTestSubClassYeh,而不是 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];  
}
4

5 回答 5

5

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

如果self是 的一个实例SubClassYeh,那么

[self inheritTest]

调用(如果有)的SubClassYeh实现inheritTest,无论该消息从何处发送(子类或超类)。

[super fromYEH]和之间的唯一区别是[self fromYEH]“fromYEH”消息的查找从超类开始,但它不会改变.selfSubClassYeh

并且您不能阻止在 Objective-C 中覆盖方法(请参阅如何避免超类方法被目标中的子类覆盖 - c或有关该主题的其他问答)。

您可以在超类中做的唯一事情是选择不会被意外覆盖的方法名称,例如通过在方法名称前加上类名称的前缀,如下所示:https ://stackoverflow.com/a/17209309/1187415 。

于 2013-09-11T07:21:37.803 回答
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);
}

(我喜欢这些名字……;)

于 2014-08-21T07:36:57.383 回答
0

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

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

无论如何,即使这段代码真的可以解决问题,我仍然认为这是非常糟糕的做法。


编辑:

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

于 2013-09-11T07:34:58.857 回答
0

如果您可以[super fromYEH]从 SubClassYeh 调用,那么[super inheritTest]以相同方式调用有什么问题?

于 2013-09-11T06:54:51.283 回答
0

我找到了解决方案。不要调用[super fromYeh]in testSuperAndSelf,而是将接收者更改为超类。使用[[[[SubClassYeh superclass] alloc] init] fromYEH]. 在 method 内部fromYEHinheritTestofSuperClassYEH将被调用。
下面是方法testSuperAndSelfin的代码片段SubClassYeh。其他代码保持不变。

- (void) testSuperAndSelf
{
    [[[[SubClassYeh superclass] alloc] init] fromYEH];  
}
于 2013-09-14T01:02:08.693 回答