从超类的方法实现返回

时间:2013-12-09 19:57:32

标签: objective-c cocoa inheritance parent-child

我有一个父类Parent和一个子类ChildParent有一个方法doSomething,该方法由Child扩展(在执行自己的工作之前调用[super doSomething]。)

在某些情况下,父母检查一些细节,并知道不应再发生任何事情,所以返回。我期望在父实现中使用return语句来阻止子进程的继续执行,但似乎并非如此。儿童实施仍在继续。这种诊断是否正确?

如果是这样,我怎样才能实现我想要的目标?

在我的实际应用程序中,父母正在做很多工作来检查它是否应该返回,代码我不希望在每个多个孩子中复制。

5 个答案:

答案 0 :(得分:2)

一种方法是将doSomething更改为BOOL的返回值。如果方法完全完成,请返回YES,否则返回NO。然后你可以做类似的事情:

父:

- (BOOL)doSomething {
    // lots of processing
    if (/* can't finish for some reason */) {
        return NO;
    } else {
        return YES;
}

子:

- (BOOL)doSomething {
    BOOL res = [super doSomething];
    if (res) {
        // complete child processing
    }

    return res;
}

答案 1 :(得分:1)

一个解决方案是提取逻辑,检查doSomething是否应该提前返回到返回BOOL的单独函数,然后从父级和子级调用它。

e.g。

- (void)doSomething {
    if (![self canDoSomething]) { return; }

    [super doSomething];

    // Custom subclass logic
}

答案 2 :(得分:0)

对于孩子来说,它看起来只是在调用另一种方法。当该方法返回时,它将继续其余的实现。它不知道您返回的原因是您不希望在重写的实现中再运行代码。

你能做什么,是使用超类中的BOOL返回值,并检查是否在子类中返回YESNO并决定是否继续基于该值。

答案 3 :(得分:0)

这是一个典型的对象init方法,我相信你很熟悉:

- (id)init
{
   self = [super init];
   if(self) {
        // init self
   }
   return self;
}

你可以做一些非常相似的事情:检查对超级实现的调用的返回值,并根据返回值做(或不做)某些事情,如下所示:

- (ResultType)doSomething
{
   ResultType *result = [super doSomething];
   if(result == nil) {
        result = // do something here
   }
   return result;
}

答案 4 :(得分:0)

我正在考虑的另一个解决方案是将“测试”和“操作”拆分如下。 Parent的{​​{1}}将执行测试。如有必要,它将返回。否则,它会调用doSomething。父母中的doThisOtherThing将为空。

每个doThisOtherThing 实施Child。它不会重新定义doThisOtherThing