Java 修改父类方法的功能(通过子类),而不更改其签名
我有三节课。我希望在父类的Java 修改父类方法的功能(通过子类),而不更改其签名,java,oop,inheritance,overriding,overloading,Java,Oop,Inheritance,Overriding,Overloading,我有三节课。我希望在父类的execute方法中,根据通过MyChild类调用此方法时设置的标志有条件地执行CodeBlock2。 出于遗留目的,不可能在父类中将execute方法的签名修改为具有额外的布尔参数 问题1。在CPP中,我曾经获得过类似的效果;根据我的经验,在使用父类等价物的包中,涉及了大量代码修改。考虑到我的变化的重要性和覆盖面,我不会这样做。Java是否有类似或更简单的方法来实现这一点 问题2。我认为在父类中使用带有标志的实例变量也是可能的,也许没有那么优雅。是否有人也能插话讨论这
execute
方法中,根据通过MyChild类调用此方法时设置的标志有条件地执行CodeBlock2。
出于遗留目的,不可能在父类中将execute
方法的签名修改为具有额外的布尔参数
问题1。在CPP中,我曾经获得过类似的效果;根据我的经验,在使用父类等价物的包中,涉及了大量代码修改。考虑到我的变化的重要性和覆盖面,我不会这样做。Java是否有类似或更简单的方法来实现这一点
问题2。我认为在父类中使用带有标志的实例变量也是可能的,也许没有那么优雅。是否有人也能插话讨论这个解决方案
我非常感谢你的意见。有一些相关但不太相似的问题
您不能从child更改父方法的方法签名 您可以使用访问修饰符
protected
在父级中定义布尔
标志,并进行更改
使用super.execute(A)
,在孩子身上
public class Child extends Parent {
@override
public void execute(String A) {
enableCodeBlock2 = true;
super.execute(A);
}
}
如果可以将
CodeBlock2
提取到Parent
类中的一个单独方法中,则以下操作将起作用:
public abstract class Parent extends GrandParent
{
@Override
public void execute(String A)
{
// CodeBlock1
codeBlock2(); // I wanna put this under if condition based on a flag in MyChild
// CodeBlock3
}
protected void codeBlock2() {
// CodeBlock2
}
}
public class MyChild extends Parent
{
@Override
protected void codeBlock2() {
if(condition) {
super.codeBlock2();
}
}
}
非常感谢你的回答。虽然这种方法确实有助于有条件地运行
CodeBlock2
,但我也希望在此之后运行CodeBlock3
。这意味着我必须提取出所有三个代码块。考虑到这将涉及100个类及其测试文件的更改,我真的很犹豫是否要这样做。谢谢你的回答。到目前为止,我将采用这种方法,因为它只涉及对两个类的更改。
public class MyChild extends GrandParent
{
@override
public boolean execute(String A)
{
String B = "123";
child.execute(B);
// child.execute(B, true); // what I wanna do
}
private Child child;
}
public abstract class Parent extends GrandParent {
protected boolean enableCodeBlock2;
@override
public void execute(String A) {
// CodeBlock1
if (enableCodeBlock2){
// CodeBlock2 // I wanna put this under if condition based on a flag in MyChild
}
// CodeBlock3
}
}
public class Child extends Parent {
@override
public void execute(String A) {
enableCodeBlock2 = true;
super.execute(A);
}
}
public abstract class Parent extends GrandParent
{
@Override
public void execute(String A)
{
// CodeBlock1
codeBlock2(); // I wanna put this under if condition based on a flag in MyChild
// CodeBlock3
}
protected void codeBlock2() {
// CodeBlock2
}
}
public class MyChild extends Parent
{
@Override
protected void codeBlock2() {
if(condition) {
super.codeBlock2();
}
}
}