覆盖使用合成的超类中的方法?

时间:2018-02-15 06:10:18

标签: java inheritance composition

澄清: 我的问题不是重写和重载函数。它涉及使用组合覆盖超类中的方法。

假设我有两个课程AB。它们真的很有用,所以我创建了另一个由两个组成的类,名为AB。这个问题是AB的子类难以覆盖A/B的方法。我正在寻找有关如何减轻下述影响的建议。

实施例

A:有一个函数可以调用另一个函数。在这种情况下,loopA(int num)循环并执行a()次数。

public class A {
    public void loopA(int num){       
        for(int i = 0; i < num; i++){   
            a();
        }
    }

    public void a(){
        System.out.println("A");
    }
}

B:只是随机功能。

public class B {
    public void b(){
        System.out.println("B");
    }
}

AB:两者的结合。

public class AB {
    A a = new A();
    B b = new B();

    public void loopA(int num){
        a.loopA(num);
    }

    public void a(){
        a.a();
    }

    public void b(){
        b.b();
    }
}

ValidatedABAB在执行a()

之前验证
public class ValidatedAB extends AB{
    @Override
    public void a(){
        System.out.println("Validate A!");
        super.a();
    }
}

问题

我的问题是,调用ValidatedAB.loopA(int num)不会调用a()中被覆盖的ValidatedAB,而是原来的A.a()

    ValidatedAB vab = new ValidatedAB();
    vab.loopA(2);

    //Desired Output:
    Validate A!
    A
    Validate A!
    A

    //Actual Output:
    A
    A

可能的解决方案

1。复制/粘贴或将A和B重构为AB

一个简单的解决方案,除了合成但导致大AB类,如果我们保留ABAB,也会导致代码重复。

2。分别为A和B子类,并将两者都注入ValidatedAB。

public class ValidatedA extends A {
    @Override
    public void a(){
        System.out.println("Validate A!");
        super.a();
    }
}

public class ValidatedAB extends AB{
    public ValidatedAB(A a, B b){
        this.a = a;
        this.b = b;
    }
}

ValidatedAB vab = new ValidatedAB(new ValidatedA(), new B());
vab.loopA(2);

这将导致很多课程(我的团队成员讨厌这个)。它还揭示了ABAB的组合这一事实(在这种情况下考虑AB具有相同的接口并不是一件可怕的事情,但否则可能会得到一些肮脏的外表)。最后,如果ValidatedAB是子类,它仍然有同样的重要问题。

结论

我希望找到一种干净,不笨重,封装的方式来达到我想要的效果,但我知道总会有权衡。作为初级开发人员,任何建议都将非常感谢。感谢。

1 个答案:

答案 0 :(得分:0)

它会覆盖方法a()但不会覆盖方法a(int) - 只需为方法添加其参数的附加覆盖或将参数添加到覆盖中。

Java将这两种方法视为不同的方法。