我有一个父类Parent
和一个子类Child
。 Parent
有一个方法doSomething
,该方法由Child
扩展(在执行自己的工作之前调用[super doSomething]
。)
在某些情况下,父母检查一些细节,并知道不应再发生任何事情,所以返回。我期望在父实现中使用return语句来阻止子进程的继续执行,但似乎并非如此。儿童实施仍在继续。这种诊断是否正确?
如果是这样,我怎样才能实现我想要的目标?
在我的实际应用程序中,父母正在做很多工作来检查它是否应该返回,代码我不希望在每个多个孩子中复制。
答案 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
返回值,并检查是否在子类中返回YES
或NO
并决定是否继续基于该值。
答案 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
。