在不更改其签名的情况下修改父 class 方法的功能(通过子 class)

Modifying functionality of a parent class method (through a child class) without changing its signature

我有三个 class。我想在 Parent class 的 execute 方法中有条件地执行 CodeBlock2,这是基于我在通过 MyChild class 调用此方法时设置的标志。 出于遗留目的,修改 Parent class 中 execute 方法的签名以具有额外的布尔参数是不可能的。

Q1。在CPP中,我曾使用lambda functions来达到类似的效果;根据我的经验,这涉及整个包中的大量代码修改,其中使用了 Parent class 的等价物。鉴于我的更改的重要性和覆盖范围,我会避免这样做。 Java 是否有一些类似或更简单的方法来实现这一目标?

Q2。我认为在 Parent class 中使用带有标志的实例变量也是可能的,也许不那么优雅。有人也可以加入这个解决方案吗?

非常感谢您的意见。有一些相关但不太相似的问题 , 2.

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
   }
}

public class Child extends Parent
{
    @override
    protected boolean someMethod()
    {
      // code
    }
}
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;
}

您不能更改 parent 的方法的方法签名 child、

您可以在 parent 中使用访问修饰符 protected 定义 boolean 标志并更改

在 child 中并使用 super.execute(A)

调用 parent 方法
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
   }
}

,并在 child

public class Child extends Parent {

   @override
   public void execute(String A) { 
       enableCodeBlock2 = true;
       super.execute(A);
   }
}

如果您可以将 CodeBlock2 提取到 Parent class 中的单独方法中,下面的方法将起作用:

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