Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Примеры использования Interface


Автор: _Y_ 26.12.2018, 10:15
Здравствуйте, уважаемые!

Давно сюда не заходил, да и на Java не пишу много лет. Но понадобился совет – по старой памяти.

Готовлю лекцию, посвящённую интерфейсам (Interface) в объектно-ориентированном программировании. Посоветуйте, пожалуйста, примеры, в которых использование Interface существенно упрощает решение проблемы. Возможно, какие-то удачные паттерны проектирования (Design Patterns)? Нужно просто и убедительно показать достоинства концепции.

Лекция адресована тем, кто ООП знает хорошо, но не работает с интерфейсами. Поэтому примеры, в которых вместо интерфейсов можно использовать абстрактные классы, мне, к сожалению, не годятся.

Почему спрашиваю в Java форуме? По многим причинам. Во-первых, по старой памяти форум этот очень уважаю. Во-вторых,  если придётся разбирать код примеров, что Java вспомнить мне проще, чем вникать в совсем неизвестный язык. В третьих, я попросту не знаю как реализованы Interface в незнакомых мне языках. ЗЫ: А уж UML диаграммы я и сам нарисую  smile 

Спасибо!

Автор: LSD 27.12.2018, 13:23
0. При наличии множественного наследования: можно обойтись и без интерфейсов. Поэтому дальше все примеры при их отсутвии.

1. Из совсем незаменимых это маркерные интерфейсы: Cloneable, Serializable. Тут альтернативы им нет.

2. Интерфейсы некого поведения, например: AutoCloseable, Iterable, всевозможные listener-ы. Т.е. в принципе базовый класс AutoCloseable можно встроить в иерархию, но это сложно и самое главное, если ты уже наследуешься от какого-то класса, то добавить поведение невозможно. Например Спринг когда видит что класс реализует интерфейс listener-а, автоматом подписывает бин на события.

3. Специфичная для Java вещь: enum не может наследоваться ни от каких классов, а реализовывать интерфейс может.

4. Опять же специфичный дла Java случай: функциональные интерфейсы. Если бы это были классы, то лямбды и method reference не работали бы, приходилось бы каждый раз создавать инстанс класса.

5. Реализация некого объекта через интерфейс: например List. В целом можно и обойтись без интерфейса, но с ним удобнее. В целом если базовый класс не содержит никакой логики и данных, то лучше сделать его интерфейсом, так у разработчика будет больше возможностей для реализации. Например есть у нас ORM (типа хибернейта). И нам надо сделать свою персистентную реализацию коллекций. С учетом того что Set, List, Map это интерфейсы мы можем создать базовый класс реализующий общую логику работы с БД, и унаследовать от него наши ORM-реализации коллекций. Если бы Set, List, Map были классами, нам бы пришлось выность его во вспомогательный класс.

Если ещё что придумаю, напишу.

Автор: _Y_ 29.12.2018, 18:15
LSD, спасибо, буду разбирать и думать, время есть. Решения специфические для Java вряд ли пойдут, язык-то программирования совсем другой. А вот неспецифичные к языкам - пойдут в первую очередь.

Кстати, мы с вами, LSD, пересекаемся на этом форуме уже лет больше десяка. Пора спрашивать "как дела" smile  Хотя, вы меня вряд ли помните - захожу раз в год, по случаю.

Автор: vvm28 30.12.2018, 01:23
Пример интерфейса  игры:
Код

/*файл GameConstants.java*/
public interface GameConstants {

    public final int DEFAULT_WIDTH = 600;//Ширина игрового поля
    public final int DEFAULT_HEIGHT = 300; //Высота игрового поля
     /*Далее пишем константы которые будут использоваться в игре */
}


Использование данного интерфейса:
Код

/*файл MyGameFrame */
public class MyGameFrame extends JFrame implements GameConstants{/*пишем код игры где используем константы*/}


Польза: Мы не загромождаем класс игры объявлениями переменных. Никому не хочется листать огромные простыни класса, классы должны быть маленькими.

Автор: _Y_ 30.12.2018, 20:35
vvm28, интересно, надо подумать. Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)