Необходимо использовать следующий контекст: Цель этого способа кодирования состоит в том, чтобы избежать if
- else
операторов и instanceof
; которая всегда плохая идея.Наследование Java не ведет себя так, как ожидалось
У меня есть 3 класса со следующими подписями:
abstract class A {}
class B extends A {}
class C extends A {}
Тогда у меня есть еще один класс со следующей структурой:
class MyClass {
private final A model;
public MyClass(A m) {
this.model = m;
}
public void doSomething() {
System.out.println(this.model instanceof C); //TRUE!!
execute(this.model);
}
private void execute(A m) {
System.out.println("noo");
}
private void execute(C m) {
System.out.println("yay");
}
}
И, наконец, содержимое моего основного:
public static void main(String... args) {
C mod = new C();
MyClass myClass = new MyClass(mod);
myClass.doSomething();
}
Теперь проблема; метод execute (C) никогда не выполняется, это всегда метод execute (A). Как я могу это решить? Я не могу изменить подпись метода execute (A) для выполнения (B), так как это даст ошибку, говоря, что java «не может разрешить выполнение метода (A)» в MyClass # doSomething.
Это может быть решена (в некоторой стоимости) с помощью [шаблон посетитель] (https://en.wikipedia.org/wiki/Visitor_pattern). –
'A model' ->' execute (A) ', в чем проблема? – Andrew
@ OliverCharlesworth еще не слышал об этом; кажется довольно интересным. – thepieterdc