Рассмотрим следующий код:
public abstract class Base {
public void getAnswer();
}
public class Derived1 extends Base {
public void getAnswer() {
}
}
public class Derived2 extends Base {
public void getAnswer() {
}
}
public class Main {
public final int DERIVED1 = 1;
public final int DERIVED2 = 2;
public Base b;
public static void Main() {
int which_obj = which();
switch (which_obj) {
case DERIVED1: Derived1 derived1 = new Derived1();
// construct object
b = derived1;
break;
case DERIVED2: Derived1 derived1 = new Derived1();
// construct object
b = derived2;
break;
}
b.getAnswer();
}
}
здесь мы используем регистр переключателя, чтобы решить, какой объект построить, и, соответственно, мы создаем его и присваиваем его b для использования полиморфизма.
какое преимущество дает нам полиморфизм?
Теперь есть метод, с помощью которого мы можем избежать случая переключения.
скажем: есть преобразование из int в String, которое возвращает «Derived1» или «Derived2».
дана строка, содержащая название класса. Теперь я могу создать объект, заданный строкой, содержащей имя класса. что-то вроде:
Base b = construct_obj(str);
вызов библиотеки construct_obj автоматически находит класс obj из байт-кодов и возвращает ссылку на объект. тогда я могу избежать случая переключения. как правило, у меня будет 100 классов производных.