Полиморфизм не работает правильно - PullRequest
1 голос
/ 03 декабря 2008

У меня есть интерфейс с именем Dictionary, у которого есть метод insert(). Этот интерфейс реализован классом BSTree, но у меня также есть класс AVLTree, который является дочерним классом BSTree. AVLTree переопределяет insert() так, чтобы он соответствовал его потребностям. Теперь, если я наберу следующий код:

Dictionary data=new AVLTree();
data.insert();

Проблема в том, что вызываемый метод insert() имеет значение BSTree вместо AVLTree. Почему полиморфизм здесь не срабатывает? Какое решение, которое сохраняет принцип полиморфизма?

Ответы [ 4 ]

6 голосов
/ 03 декабря 2008

Когда вы говорите, что AVLTree «переопределяет» вставку, что именно вы имеете в виду? Он должен переопределить метод, что означает наличие точно такой же сигнатуры (по модулю дисперсии).

Не могли бы вы опубликовать подписи insert () в BSTree и AVLTree?

Если вы примените аннотацию @Override в AVLTree (при условии достаточно недавнего JDK), вы должны получить предупреждение / ошибку, если вы не получили правильную подпись.

2 голосов
/ 03 декабря 2008

Уже решил это. В интерфейсе Dictionary функция выглядела как insert (Object x), BSTree придерживался этого требования и определял параметр как Object, но в AVLTree параметр имел тип Comparable, после изменения его на Object он работал.

В любом случае, спасибо :)

2 голосов
/ 03 декабря 2008

Вы должны предоставить больше фрагментов кода. Я полагаю, это выглядит примерно так:

public Interface Dictionary {
  ...
  public void insert();
  ...
}

public Class BSTree implements Dictionary {
  ...
  public void insert() {
    // some implementation here
  }
  ...
}

public Class AVLTree extends BSTree {
  ...
  public void insert() {
    // another implementation of insert
  }
  ...
}

Это на самом деле должно работать. Может быть, вы использовали приватный или финальный модификатор где-нибудь?

Привет

1 голос
/ 03 декабря 2008

В Java (я говорю относительно C ++) полиморфизм должен "всегда" работать. Трудно понять, что не так, не глядя на код .. может быть, вы могли бы опубликовать интересную часть? Например, подпись метода, объявление класса и т. Д. Я предполагаю, что вы не использовали одну и ту же сигнатуру для обоих методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...