Я недавно натолкнулся на проблему с API и реализацией, где появился следующий тип кода:
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);
}
}
Что приводит к:
% java Main
B.sum(B) called
A.sum(A) called
A.sum(A) called
Я понимаю, что сумма B не переопределяетСумма A, поскольку ее подпись различна, но я хотел бы обеспечить эффективную реализацию суммы для объектов эффективного типа B. Я думаю, что такой дизайн довольно классический, и я хотел бы сейчас узнать, как мне разработать свой API и реализацию так, чтобы онявляется эффективным.
Конечно, я мог бы предоставить sum (A a) в классе be и проверить, является ли b instanceOf B, прежде чем вызывать sum (B) или super, но я подумал, что instanceOf следует избегатьпо соображениям эффективности (если он неэффективен, он может быть еще менее эффективным, чем моя «абстрактная» реализация.