Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
10 / 10 / 1
Регистрация: 12.07.2013
Сообщений: 147

Какой смысл применять интерфейс?

29.07.2013, 17:51. Показов 1665. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Какой смысл применять интерфейс, если методы нужно реализовать в производных классах?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.07.2013, 17:51
Ответы с готовыми решениями:

Какой смысл синхронизации в многопоточности ?
Зачем нужно синхронизировать переменные(ресурсы) или методы если они итак портят принцип паралелизма, зачем вообще эту тему внесли в...

Графический интерфейс на Java. Есть ли в них смысл ?
Вот смотрю что люди на форме где то 40 процентов вопросов задают по вопросам разработки графического дизайна на яве. Уже работаю не...

EJB: когда применять и не применять
Когда правильно вводить EJB компоненты? Все-таки их использование связано с определенными затратами на конфигурирование и всю эту возню. А...

11
38 / 38 / 11
Регистрация: 21.05.2013
Сообщений: 128
29.07.2013, 18:14
Как один из примеров:
Есть допустим метод в него мы хотим передавать наборы данных(аргумент ф-ии), с которыми там будет что то делаться. Мы можем просто указать что аргумент будет типа Тип1 - конкретный класс, но если позже мы захотим чтобы этот метод еще принимал объекты типа Тип2, может возникнуть проблемы: во-первых возможно метод использует методы Тип1 которых вообще нет в Тип2, во-вторых надо будет мучиться с приведением типов.
Есть же определить тип аргумента как интерфейс например - стандартный интерфейс Collection, тогда эти проблемы отпадают, можно будет передавать ArrayList, ArrayDeque и пр. То есть применение интерфейса в данном случае расширяет наши будущие возможности.
0
10 / 10 / 1
Регистрация: 12.07.2013
Сообщений: 147
29.07.2013, 18:19  [ТС]
Извините за непонимание, но нельзя бы было с примерчиками? Хотя бы простенькими?
0
 Аватар для exiqa
487 / 333 / 71
Регистрация: 24.12.2011
Сообщений: 591
29.07.2013, 19:14
Лучший ответ Сообщение было отмечено как решение

Решение

Представьте себе такой вот интерфейс
Java
1
2
3
interface Тара {
    double объем();
}
и есть несколько классов, его реализующих
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Рюмка implements Тара {
    public double объем() {
        return 0.1;
    }
}
 
class Стакан implements Тара {
    public double объем() {
        return 0.2;
    }
}
 
class Бокал implements Тара {
    public double объем() {
        return 0.5;
    }
}
далее, есть такой класс Бармен, который работает со всем этим добром
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Бармен {
    double большаяБутылкаВиски = 1;
 
    boolean налить(Тара тара) {
        if (большаяБутылкаВиски <= 0) {
            System.out.println("Виски закончилось");
            return false;
        }
        double нужныйОбъем = тара.объем();
        if (большаяБутылкаВиски < нужныйОбъем) {
            System.out.println("Сорри, могу налить только " + большаяБутылкаВиски);
            return false;
        } else {
            большаяБутылкаВиски -= нужныйОбъем;
            System.out.println("Налил - " + нужныйОбъем + " Еще осталось "
                    + большаяБутылкаВиски + " Налетай!");
            return true;
        }
    }
}
обратите внимание на параметр метода "налить". Бармену в принципе все равно в какую посудину наливать, главное чтобы то, что ему подсунули реализовывало интерфейс Тара, чтобы он мог посчитать нужный объем. Вы можете создать какой нибудь свой класс, например Тазик, реализовать интерфейс Тара и подсунуть его бармену.

ну и тестик
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test {
    public static void main(String[] args) {
        List<Тара> list = new ArrayList<>();
        list.add(new Бокал());
        list.add(new Рюмка());
        list.add(new Стакан());
        list.add(new Бокал());
 
        Бармен бармен = new Бармен();
        for (Тара тара : list) {
            бармен.налить(тара);
        }
 
    }
}
Вывод
Bash
1
2
3
4
Налил - 0.5 Еще осталось 0.5 Налетай!
Налил - 0.1 Еще осталось 0.4 Налетай!
Налил - 0.2 Еще осталось 0.2 Налетай!
Сорри, могу налить только 0.2
5
10 / 10 / 1
Регистрация: 12.07.2013
Сообщений: 147
29.07.2013, 19:29  [ТС]
Цитата Сообщение от exiqa Посмотреть сообщение
Представьте себе такой вот интерфейс
Java
1
2
3
interface Тара {
    double объем();
}
и есть несколько классов, его реализующих
Почему бы не объявить класс Тара, как базовый, а остальные классы унаследовать от него?
0
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
29.07.2013, 20:24
Я так понимаю, это все становится актуально если большой проект и пишут разные люди.
А если сам себе на коленке приложение то интерфейсы эти до лампочки, я в своих классах и так прекрасно понимаю что там принимается и отдается.
Пример зачетный про тару но что мешает мне просто сделать класс Баклашка и без implements Tapa реализовать в нем метод налить?

Поправьте, если я не прав.
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
29.07.2013, 20:27
Цитата Сообщение от Ханасака Посмотреть сообщение
Почему бы не объявить класс Тара, как базовый, а остальные классы унаследовать от него?
а Тара это "физическое воплощение" предмета? "Тара" - это воздух, пустота, черная дыра... Бокал - физическая штука с физическими параметрами

Добавлено через 2 минуты
да, кстати, к примеру вам в метод принимаете коллекцию (ArrayList например, чтобы реализовать "что-то с ним"), то вы на вход принимаете List (интерфейс вверх по иерархии)... дальше уже не важно что и как вы делаете, программист-клиент спокоен что "всё работает как надо". Тут вы с утра проснулись, решили "переписать сортировку"...да не проблема, программист-клиент даже не узнает
0
 Аватар для exiqa
487 / 333 / 71
Регистрация: 24.12.2011
Сообщений: 591
29.07.2013, 21:09
Цитата Сообщение от Ханасака Посмотреть сообщение
Почему бы не объявить класс Тара, как базовый, а остальные классы унаследовать от него?
Потому что программирование, построенное на интерфейсах, дает больше эффекта. В java нет множественного наследования, и один раз унаследовавшись от какого то класса, например вот так
Java
1
class Ботинок extends Обувь
вы лишаете себя маневренности. Так уже не получится напиться
Java
1
class Ботинок extends Обувь, Тара
а вот так вполне
Java
1
class Ботинок extends Обувь implements Тара
2
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
29.07.2013, 22:36
Интерфес больше нужен для полиморфизма ... Почитайте книги по паттернам лучше поймёте для чего они .
Если учили с++ или с то интерфес это почти тот же самый заголовочный файл ...

Добавлено через 6 минут
Или на пример вы работа датель ищете Программиста ... у вас есть массив объектов типа "Молодые люди" и вам нужно определить кто из них программист (вспомним что у java одиночное наследование и все молодые люди субклассируют класс люди) и как же определить? Мы просто проверяем реализует ли объект интерфес "Программист" и вызываем у него метод "программировать" при том мы не сможем вызвать такие методы объекта
как "говорить" , "кушать" , "танцевать" . Нам нужно только то что бы объект реализовал интерфейс "программист"
(при том java гарантирует что вы реализуете все методы интерфейса) и вам не важно что он ещё там умеет делать.
Здесь интерфейс используется как супер тип который помогает "отфильтровать" не нужные методы ... При том каждый программист программирует по своему по этому это ещё 1 + так как каждый касс может по свойму реализовать этот метод , но главное он есть у него.
1
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
29.07.2013, 22:45
на самом деле реальная необходимость интерфейса в случае с апликейшен серверами, не такая уж и теоретическая.
EJB - вызывается через клиентский интерфейс.
JMX- тоже, RMI - тоже.

в случае промышленного программирования тоже. Главный пишет интерфейс и раздаёт делать имплементацию васе и пете.
по задаче вася должен вызывать из кода пети пару методов, так вот чтобы вася не ждал пока петя напишет класс, он использует интерфейс под который пишет имплементацию петя и они работают параллельно
2
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 8
14.01.2014, 00:19
Возник еще один вопрос, допустим есть множество генераторов чисел, у всех них есть общие методы которые разумно вынести в базовый класс. Но как мне говорят "интерфейсы очень классная штука и лучше использовать их"

Теперь сам вопрос:
Как лучше организовать наследование
Интерфейс => Базовый класс => Все остальные
Или можно в данном случае забить на интерфейсы?
0
10 / 10 / 1
Регистрация: 12.07.2013
Сообщений: 147
14.01.2014, 01:58  [ТС]
Я так думаю, что если важно будет, чтоб реализация методов отличалась между собой, тогда делаем единый интерфейс, а реализуем его во всех остальных классах, без базового. Если же все равно какая реализация, то не нужен интерфейс. Один базовый класс, а остальные либо наследуют его, либо содержат в полях его объекты (композиция).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2014, 01:58
Помогаю со студенческими работами здесь

vba в Excel жутко тормозит, какой смысл его применять
Написал пару строк для печати Счета из Excel через Word и Excel стал 5 минут загружаться и 5 мин выгружаться. Какой смысл в такой...

Какой редактор применять в Windows?
кто знает какой редактор применять в виндовс чтобы не ломать кодировку уникс?

Интерфейс и смысл его реализации
Для возможности сравнения объектов между собой необходимо: создать интерфейс Icompare, который содержал бы методы сравнения (&gt;, &gt;=,...

Какой оператор надо применять при вводе исходных данных?
Здравствуйте! Прошу помощи. Не знаю, почему выдаётся предупреждение: Run-time error ‘13’. Type mismatch. Что надо сделать? Sub...

Какие методы есть в C++ для работы с файлами и в каких случаях какой лучше применять
Какие методы есть в С++ для работы с файлами и в каких случаях какой лучше применять? обычно пользовался freopen знаю еще есть fopen и ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru