Я пытаюсь сделать класс абстрактного алгоритма для информированного поиска с различными эвристиками. Моя идея заключалась в том, чтобы разные подклассы перезаписывали метод эвристики() по умолчанию, но динамическое связывание, похоже, не работает, когда я вызываю подклассы.Методы подкласса Java не переопределяют, несмотря на явное использование @Override
В astar.java:
public interface Astar {
abstract String heuristic();
}
В search.java
public class Search implements Astar {
public String heuristic() { return "default heuristic"; }
}
В EuclidianSearch.java:
public class EuclidianSearch extends Search {
@Override
public String heuristic() { return "Euclidian"; }
}
В ChebyshevSearch.java:
public class ChebyshevSearch extends Search {
@Override
public String heuristic() { return "Chebyshev"; }
}
В main.java:
EuclidianSearch e_search = null; ChebyshevDistance ch_search = null;
Search[] SearchObjects = {e_search, ch_search};
for(Search so : SearchObjects) {
System.out.println(so.heuristic());
}
При запуске он отображает:
default heuristic
default heuristic
Я определяю массив с точки зрения Search
поэтому я может быть гибким: в конце концов, я хочу иметь пять или более разных эвристик. Почему метод heuristic()
подкласса не переопределяет класс суперкласса?
У вас нет 'EuclideanSearch' и' ChebyshevDistance'; у вас есть два нуля. Этот код выйдет из строя с помощью «NullPointerException». – user2357112
Обратите внимание: класс объекта не обязательно совпадает с типом переменной, которая ссылается на него. Когда вы пишете что-то в своем коде, как 'new EuclideanSearch()', это то, что контролирует класс создаваемого объекта - и это то, что контролирует, какая из версий вашего метода будет фактически вызвана. Тип переменной, которую вы назначаете созданному объекту, не имеет отношения к вызову метода. –