【问题标题】:how to return a child method from its parent method?如何从其父方法返回子方法?
【发布时间】:2012-03-17 19:36:38
【问题描述】:
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方法,所以系统会根据需要自动执行,我不能停下来调用它。

【问题讨论】:

  • 一个简化的具体例子——以及语法正确的代码——会增加你得到满意答案的几率。

标签: java oop


【解决方案1】:

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

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

myMethod() 将调用super.myMethod() [它没有被覆盖,因此实际上超级将立即被调用],并且超级将调用[如果满足条件] 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
  }
}

【讨论】:

  • 很好的答案。给我一个想法,可能的解决方案可能是创建一个仅从父级调用的不同方法。喜欢投票,但不能接受作为答案。想知道为什么??请查看更新后的问题。
  • @ShailendraRajawat:我阅读了编辑,API 方法仍然是myMethod(),覆盖的myTemplateMethod() 将仅从超级的myMethod() 调用。由于模板方法模式的使用,API 根本没有改变,唯一改变的是子类将覆盖 myTemplateMethod() 而不是 myMethod()。调用仍需使用myMethod()
  • 同意。似乎我提供同名 myMethod() 的梦想无法实现。谢谢你的努力。使用这个解决方案。
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多