私は最近、次のタイプのコードが表示される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の合計がAの合計をオーバーライドしないことは理解していますが、効果的なタイプBのオブジェクトに対して合計の効率的な実装を提供したいと思います。このような設計は非常に古典的だと思います。効率的になるようにAPIと実装を設計する必要があります。
もちろんsum(A a)
、クラスBで提供し、bがBであるかどうかを確認してから、またはsuperinstanceof
を呼び出すこともできますが、効率上の理由から、これは避けるべきsum(B b)
だと思いました。instanceof
(非効率的な場合、私の抽象的な実装ではさらに効率が低下する可能性があります)