【问题标题】:Modifying functionality of a parent class method (through a child class) without changing its signature修改父类方法的功能(通过子类)而不更改其签名
【发布时间】:2020-05-16 03:38:09
【问题描述】:

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

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

第二季度。我认为在 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;
}

【问题讨论】:

    标签: java oop inheritance overriding overloading


    【解决方案1】:

    如果您可以将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 多个类及其测试文件的更改,我真的很犹豫。
    【解决方案2】:

    你不能从孩子改变父方法的方法签名,

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

    在子中使用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);
       }
    }
    

    【讨论】:

    • 感谢您的回答。到目前为止,我将采用这种方法,因为它只涉及对两个类的更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多