2017-02-12 8 views
-3

Я пытаюсь сделать класс абстрактного алгоритма для информированного поиска с различными эвристиками. Моя идея заключалась в том, чтобы разные подклассы перезаписывали метод эвристики() по умолчанию, но динамическое связывание, похоже, не работает, когда я вызываю подклассы.Методы подкласса 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() подкласса не переопределяет класс суперкласса?

+7

У вас нет 'EuclideanSearch' и' ChebyshevDistance'; у вас есть два нуля. Этот код выйдет из строя с помощью «NullPointerException». – user2357112

+1

Обратите внимание: класс объекта не обязательно совпадает с типом переменной, которая ссылается на него. Когда вы пишете что-то в своем коде, как 'new EuclideanSearch()', это то, что контролирует класс создаваемого объекта - и это то, что контролирует, какая из версий вашего метода будет фактически вызвана. Тип переменной, которую вы назначаете созданному объекту, не имеет отношения к вызову метода. –

ответ

0

вы получите NullPointerException для вызова so.heuristic(), потому что вы не класс экземпляра, использовать эти коды:

EuclidianSearch e_search = new EuclidianSearch(); 
ChebyshevDistance ch_search = new ChebyshevDistance(); 

но этого не достаточно, чтобы решить вам проблему, вы должны реализовать интерфейс ASTART путем разные классы. не забывайте, что класс, реализующий интерфейс, должен реализовать весь метод интерфейса. в противном случае вы должны определить абстрактный класс, чтобы определить только некоторые методы и переопределить методы останова в других классах с расширенным предыдущим классом.

public class Search implements Astar { 

    @Override 
    public String heuristic() { return "default heuristic"; } 
} 
Смежные вопросы