Д.з.№8 Полиморфизм

Как легко видеть из д.з. №7, стек и очередь очень похожи. И то, и другое - это некоторый контейнер, предоставляющий две операции: 1) добавить элемент, 2) удалить элемент. Поэтому будет полезно выделить под это дело отдельную абстракцию.

1. Переделать классы Stack и Queue из д.з.№7, объявив, что они реализуют ("implements") интерфейс Container, в котором имеются следующие операции:
  • void put(double val);
  • double get();
  • int getSize();
  • void clear();
2. Протестировать работу полиморфных вызовов, создав класс Test и реализовав в нем статическую функцию:
  • void dialog(Container c);
- которая, полиморфно вызывая операции переданного в нее контейнера, предоставляет пользователю возможность протестировать основные операции со стеком и очередью. Эта функция выводит на экран меню, подобное следующему:
1. Put
2. Get
3. Exit
 - и реализует его операции 3. В функции Test.main() вывести на экран меню, предлагающее пользователю выбрать, с каким контейнером он хочет работать (с очередью или стеком), после чего воспользоваться функцией dialog() для предоставления ему такой возможности.

Технические подробности

  • Классы Stack и Queue, как и прежде, реализованы на основе Vector'а из д.з. №7.
  • Формат меню пользователя соблюдать с точностью до запятой не обязательно - автоматика его проверять не будет.
  • Сохранять в классах "старые" методы push/pop/enqueue/dequeue совместно с "новыми" put/get нецелесообразно.

Примеры

Вход Выход
// stack
Container c = new Stack();
c.put(1);
c.put(2);
// reverse order
System.out.println(c.get());
System.out.println(c.get());

// queue
c = new Queue();
c.put(10);
c.put(20);
// same order
System.out.println(c.get());
System.out.println(c.get());
2.0
1.0
10.0
20.0
 
1. Stack
2. Queue
3. Exit
1

1. Put
2. Get
3. Exit
1
Enter element: 2

1. Put
2. Get
3. Exit
1
Enter element: 3

1. Put
2. Get
3. Exit
2
Got: 3.0

1. Put
2. Get
3. Exit
2
Got: 2.0

1. Put
2. Get
3. Exit
3

Контрольные вопросы

  • Что такое наследование интерфейса и наследование реализации? Какое наследование используется в данной задаче?
  • Приведите пример полиморфного вызова метода (через ссылку на базовый класс).
  • Что такое полиморфный вызов метода класса? Перечислите полиморфные вызовы в Вашей программе.
Comments