Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修改父类方法的功能(通过子类),而不更改其签名_Java_Oop_Inheritance_Overriding_Overloading - Fatal编程技术网

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();
        }
    }
}