我最近在API和实现方面遇到了一个问题,其中出现了以下类型的代码:
public abstract class A {
public A sum(A a) {
System.out.println("A.sum(A) called");
return null;
}
}
实现是一个简单的类:
public class B extends A {
public B sum(B b) {
System.out.println("B.sum(B) called");
return null;
}
}
在使用它时,我写下:
public class Main {
public static void main(String[] args) {
B b = new B();
A basa = new B();
b.sum(b);
basa.sum(b);
basa.sum(basa);
}
}
这导致:
B.sum(B) called
A.sum(A) called
A.sum(A) called
我知道B的sum方法不会覆盖A的sum方法,因为它们的签名不同,但我想提供一种有效类型为B的对象的高效实现。我认为这样的设计相当经典,并且我想知道如何设计我的API和实现,使其效率更高。
当然,我可以在B类中提供"sum(A a)"方法,在调用"sum(B b)"或者super之前检查b是否是B的实例。但我认为应该避免使用instanceof来提高效率。(如果它本身很低效的话,可能会更低效)
SumVisitor
中有一个 bug,但我不够聪明去修复它 - 你从未使用arg
,只是将所有东西加到自己身上,这意味着x.visit(new SumVisitor(y))
只是一种迂回的方式来写x.sum(x)
。仅仅将accept(B)
更改为return b.sum(arg)
或return arg.sum(b)
是行不通的,因为两者都会解析为sum(A)
。 - gustafc