Использование интерфейса в другом интерфейсе - PullRequest
2 голосов
/ 30 июня 2011

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

Класс QueueItem

 public interface QueueItem 

     {

     /** 
    * Returns the priority of this item. The priority is guaranteed to be 
    * between 0 - 100, where 0 is lowest and 100 is highest priority.
    */

    public int priority();

    }

Класс PriorityQueue

 public interface PriorityQueue 

     {

    /**
    * Inserts a queue item into the priority queue.
    */
    public void insert(QueueItem q);

    /**
    * Returns the item with the highest priority.
    */
    public QueueItem next();

 }

Класс QuickInsertQueue

public class QuickInsertQueue implements  PriorityQueue  {

    @Override
    public void insert(QueueItem q) {
        // TODO Auto-generated method stub

    }

    @Override
    public QueueItem next() {
        // TODO Auto-generated method stub
        return null;
    }

}

Мне нужно написать класс QuickInsertQueue, который реализует интерфейс PriorityQueue с insert() методом O (1).

Ответы [ 4 ]

2 голосов
/ 30 июня 2011

Вы уже на правильном пути. Ваши интерфейсы определены, и к определению вашего класса добавлена ​​правильная реализация. Поскольку вы говорите, что не хотите, чтобы вам передавали ложку кода, которую я приветствую - следующий шаг, который вы хотите реализовать, - это на самом деле добавление переменной экземпляра HashMap в ваш класс, поскольку это ваше базовое хранилище. И в вашей реализации метода для вставки вы будете добавлять свою переменную на карту.

В конце концов вам нужно будет прочитать о Generics .

1 голос
/ 30 июня 2011

Тед и Восприятие, вы сказали, что вам нужно. Еще одно предложение, которое у меня есть, - вам нужно найти правильную структуру данных для использования, чтобы вставка была O (1). Я предлагаю вам посмотреть на кучи. Специально глядя на min-heaps позволяет вставлять в постоянное время. Смотрите здесь . Надеюсь, это поможет.

0 голосов
/ 30 июня 2011

Вы на правильном пути.Таким образом, не вдаваясь в детали уровня кода, что вы правы, вы должны выяснить самостоятельно, как это (должно) работать в идеальном мире -

  1. Все взаимодействие в вашемСистема между различными видами объектов определяется с помощью интерфейсов.то есть, если вам нужно выяснить, «как вещи взаимодействуют в моем приложении», вы должны смотреть не дальше, чем все интерфейсы.(Все остальное - детали реализации.) Другими словами, вся реальная работа выполняется классами (которые реализуют интерфейсы), но взаимодействие определяется интерфейсами .

  2. Один класс реализации, например QuickInsertQueue, не должен знать ничего о других реализациях.(например, реализация QueueItem), т.е. QueueItem не нужно знать о том, какой класс реализует PriorityQueue, и не нужно знать PriorityQueue о классе, который реализует QueueItem. (Чтобы это работало, убедитесь, чтов интерфейсе есть все методы, необходимые для взаимодействия с ним других. Также обратите внимание, что классы могут реализовывать несколько интерфейсов)

Практически,

  • Если вы не используете такие вещи, как шаблон фабричного метода и / или контейнеры IoC, такие как Spring или Guice , вы будетеиметь, по крайней мере, экземпляр реализации (т. е. объект класса), который создает экземпляры других реализаций (объектов других классов) в вашей системе.

(В данном случае структуру данных использовать для вставкидолжно быть O (1) подробное описание вопроса / обсуждение)

0 голосов
/ 30 июня 2011

Вы используете интерфейс, чтобы гарантировать, что любой объект, который вы получаете, будет вести себя в соответствии с интерфейсом. Вот почему ваш QuickInsertQueue должен реализовать методы PriorityQueue. Однако единственная информация, которую он может использовать о вставленных объектах, заключается в том, что они ведут себя в соответствии с QueueItem интерфейсом - то есть они имеют метод priority(), который возвращает int. Ваша реализация может полагаться на это, но не более, на объекты, которыми она будет управлять.

...