覆盖子类Java中的类方法

时间:2017-08-24 01:54:20

标签: java oop

我有一个有两种方法的课程:

class A {
  public methodA();
  public methodB();
}

我还有另外两个班级B& C,其中A类为其成员:

class B {
   A a;
   B(Config config) {
      a = config.getA();
   }
}

class C {
   A a;
   C(Config config) {
     a = config.getA();
   }
}

但是,在C类中,我想实现方法B的不同方式。我想我需要覆盖该方法,但是我需要将类A作为抽象类。那是对的吗?有没有不同的方法来解决这个问题

编辑:我不是直接创建A的新实例。我是从帮助器类中获取它的。

2 个答案:

答案 0 :(得分:1)

  

我需要将A类作为抽象类

不只是确保没有将methodB声明为final,因为无法覆盖final方法。您可以通过在C代码中的A类中创建一个新的匿名类来覆盖方法“inline”:

class C {
    A a;
    C() {
        a = new A() {
            @Override
            public void methodB() {
                // .... code goes here
            }
        };
    }
}

答案 1 :(得分:0)

无法以简单的方式完成。

在Java中,如果需要覆盖方法,则在子类中完成。但是,当您从其他人(A)获取config的实例时,您无法控制由config实例化的类。

有一些替代方案:

如果可以在不知道methodB内部的情况下完成新的A,则可以创建A的包装:

class C {
   static class CustomA extends A{
       A a;
       public CustomA (A a) { this.a = a; }

       @Override
       public void methodB() {
           a.methodB();
           a.otherMethod();
       }
   }
   A a;
   C(Config config) {
     a = new CustomA(config.getA());
   }
}

另一种方法是更改​​Config以允许创建由A调用者指定的其他getA()子类。这可以通过像反射或初始化已经创建的A实例等错误方式来完成。

另一种选择是将methodB的逻辑提取到策略中。因此,您可以将策略替换为您想要的任何内容。查看GoF设计模式中的策略模式。