1

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

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

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

我真的很感激你的意见。有一些相关但不太相似的问题12

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

2 回答 2

1

如果您可以提取CodeBlock2Parent类中的单独方法中,则以下内容将起作用:

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();
        }
    }
}
于 2020-05-16T03:50:13.477 回答
0

您不能从孩子更改父方法的方法签名,

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

在孩子中并使用调用父方法super.execute(A)

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);
   }
}
于 2020-05-16T03:45:52.547 回答