2012-03-17 71 views
0
Class parent { 

protected void myMethod() { 
if(someCodition) { 
//return this as well as child's myMethod. 
    } 
} 

Class child extends Parent { 

@override 
protected void myMethod() { 
super.myMethod(); 
//code below this line should not execute if someCondition. 
//want parent to handle all this 
    } 
} 

请不要建议在父类中带一些布尔标志类的东西,并在子类中检查它。其实儿童班将被其他开发者使用,我不希望他们照顾任何这样的条件,所以想从父母本身退出。如何从父方法返回一个子方法?

我完全意识到它违反了oops的抽象原则,但它违反了我的要求。

更新

PS:调用myMethod的()不在任一儿童或父母的控制,以在一个答案提到不能创建一个单独的方法。 实际上它的API和方法,所以系统会根据需要自动执行它,我不能停下来调用它。

+0

一个简化的具体示例 - 以及语法正确的代码 - 会提高您得到满意答案的几率。 – 2012-03-17 13:14:25

回答

2

您可能正在寻找template method pattern [或它的一些变化]

用户将覆盖保护的方法myTemplateMethod(),并且myMethod()不会被覆盖。

myMethod()将调用super.myMethod() [它没有覆盖所以实际上鲁能将immidiately调用]和超将调用[如果条件得到满足]沿着[伪代码]行myTemplateMethod()

东西:

abstract Class parent { 

protected abstract void myTemplateMethod(); 

protected final void myMethod() { 
if(someCodition) { 
    myTemplateMethod(); 
    } 
} 

Class child extends Parent { 

@override 
protected void myTemplateMethod() { 
//code that will be invoked only if someCodition is met 
    } 
} 
+0

不错的答案。给我想法,可能的解决方案可能是创建一个不同的方法,只会从父母调用。爱上了它,但不能接受作为答案。想知道为什么?请参阅更新的问题。 – 2012-03-17 11:31:32

+2

@ShailendraRajawat:我读了编辑,API方法仍然是'myMethod()',只有从超级myMethod()调用覆盖'myTemplateMethod()'。由于模板方法模式的用法,API根本不会改变,唯一会改变的是子类将会覆盖'myTemplateMethod()'而不是'myMethod()'。 Invokation仍然是使用'myMethod()'。 – amit 2012-03-17 11:40:28

+0

Agree.seems我的梦想提供相同的名称myMethod()不能实现。谢谢你的努力。用这个解决方案。 – 2012-03-17 15:20:39