澄清: 我的问题不是重写和重载函数。它涉及使用组合覆盖超类中的方法。
假设我有两个课程A
和B
。它们真的很有用,所以我创建了另一个由两个组成的类,名为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();
}
}
ValidatedAB
:AB
在执行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
类,如果我们保留A
,B
和AB
,也会导致代码重复。
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);
这将导致很多课程(我的团队成员讨厌这个)。它还揭示了AB
是A
和B
的组合这一事实(在这种情况下考虑AB
具有相同的接口并不是一件可怕的事情,但否则可能会得到一些肮脏的外表)。最后,如果ValidatedAB
是子类,它仍然有同样的重要问题。
我希望找到一种干净,不笨重,封装的方式来达到我想要的效果,但我知道总会有权衡。作为初级开发人员,任何建议都将非常感谢。感谢。
答案 0 :(得分:0)
它会覆盖方法a()
但不会覆盖方法a(int)
- 只需为方法添加其参数的附加覆盖或将参数添加到覆盖中。
Java将这两种方法视为不同的方法。