У меня есть интерфейс, который называется «Я»:полиморфизм и переключатель случай на основе экземпляра
package org.example;
public interface I {
}
Довольно простой :-)
У меня есть классы, реализующие этот интерфейс. Они называются A, B, C, D, E и т. Д.
Классы A и B имеют определенные методы, как показано ниже. Других классов нет.
public class A implements I {
public void sayHelloFromA() {
System.out.println("Hello from A");
}
}
public class B implements I {
public void sayHelloFromB() {
System.out.println("Hello from B");
}
}
Мой главный метод перебирает список объектов I, и я хочу, чтобы выполнить определенные действия в зависимости от типа класса.
package org.example;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(final String[] args) {
final A a = new A();
final B b = new B();
final C c = new C();
final List<I> list = new ArrayList<I>();
list.add(a);
list.add(b);
list.add(c);
for (final I i : list) {
sayHello(i);
}
}
public static void sayHello(final A a) {
a.sayHelloFromA();
}
public static void sayHello(final B b) {
b.sayHelloFromB();
}
public static void sayHello(final I i) {
System.out.println("Unsupported");
}
}
В чем проблема; выход:
Unsupported
Unsupported
Unsupported
Я знал, что это не будет работать, но вопрос в том, как сделать эту работу без использования InstanceOf или рефлексия. Трюк заключается в том, что я не могу изменить интерфейс I (в реальной жизни, я думаю, это javax.swing.tree.TreeNode).
Я не использую шаблон посетителя, потому что считаю, что шаблон посетителя лучше подходит, если у вас есть фиксированный набор типов классов, и вы добавляете новые операции над этими типами. В моей реальной жизни это наоборот: у меня есть только одна операция, и я часто добавляю в список новые типы ...
Используйте экземпляр, отражение или получите имя класса и включите его. –
Можете ли вы определить дополнительный 'sayHello()' метод на вашем интерфейсе? И затем, каждый из ваших классов реализует это как: класс A { sayHello() { sayHelloFromA(); } sayHelloFromA() { // Логика здесь идет }} Если вы не можете добавить метод интерфейса, вы, вероятно, могли бы расширить его – jmm
Почему вы не можете определить SayHello() в интерфейсе и реализации это в каждом классе? –