@mrFrip
Преодолеваю прокрастинацию

Смысл интерфейса (не GUI) и зачем он вообще нужен?

Здравствуйте!

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

Т.е. создавая класс, и реализуя интерфейс, разработчик обязан определить поля/свойства/методы интерфейса в классе.

Но я тут задался вопросом целесообразности данного решения. Что нам мешает изначально на стадии планировки классов, включить в них определенные поля/свойства/методы не прибегая к интерфейсам?

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

Надеюсь, вопрос понятен, и возможно я сам на него и ответил, но все же, хочу быть уверенным в том, что мои выводы верны, дабы в будущем не попасть в нелепую ситуацию.
Если мои доводы неверны, прошу грамотно объяснить смысл и область применения интерфейсов.

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

Спасибо!
  • Вопрос задан
  • 1269 просмотров
Пригласить эксперта
Ответы на вопрос 7
Griboks
@Griboks Куратор тега C#
Интерфейс - иной уровень абстракции. Это более продвинутое программирование на уровне что надо сделать, а не как надо сделать.
Как использовать библиотеку? Как связать две программы, два разных куска когда? Как заложить гибкость в проект? Как предусмотреть модернизацию программы? Надо использовать интерфейс.
Ответ написан
Комментировать
GavriKos
@GavriKos
Один из распространенных кейсов - это использование интерфейса как обобщенного типа данных для разных классов.
Например, есть интерфейс "Фигура", в котором есть два метода - "посчитать площадь" и "посчитать периметр".
Есть классы, реализующие этот интерфейс - квадрат, круг, треугольник, трапеция.

И где то вам нужно хранить что то вроде "текущая фигура" по смыслу - вот вы можете и использовать "Фигура" как тип данных.
Ответ написан
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
я не готов дать оценку вашему пониманию ООП...
но по ходу, в пору покувыркаться в функциональной парадигме... (хуже точно не станет)

ps интерфейс - альтернатива множественному наследованию. как то так
Ответ написан
Комментировать
Morpheus_God
@Morpheus_God
Простой пример. У вас есть какая то программа которая должна передавать отчет. Сегодня вы реализовали класс с сохранением в файл, а завтра вам надо будет переслать этот отчет другим способом. И каждый раз будете писать новый класс переписывая логику программы? Зачем. Когда создается интерфейс и при передаче отчета куда либо будет использоваться метод интерфейса. А вот как уже он будет реализован это дело десятое. Главное, что метод для передачи нужных данных будет четко задан за счет интерфейса.
Интерфейс это четкий набор методов для реализуемого его класса или структуры, требуемый в программе. И дело тут не в команде программистов.
Вот один из паттернов в котором применяются интерфейсы, где вызывается конкретный метод а за его реализацию отвечает совсем другая часть программы.
Ответ написан
Поставил + многим, и добавлю.
Прочитайте про SOLID, букву D.

Вы ничего не должны делать просто потому что так делают другие. Но вам желательно это понять, если хотите писать не домашние пет проекты а чуть более сложный софт который годами будут поддерживать множество людей.

Инверсия и полиморфизм это очень важная тема в разработке ПО и ООП. На этом завязано много паттернов, принципов.
GOF, SOLID, GRASP.
Вы даже тесты не сможете написать без интерфейсов.

Все это придумано не для того что бы вам голову морочить, это результат работы многих программистов которые десятилетия шли к ним самстоятельно.
Ответ написан
Комментировать
qonand
@qonand
Software Engineer
Т.е. могу сделать вывод, что интерфейс в сущности своей, предназначен скорее для удобства и организации в структурах различных классов, т.е. дать им общее, но реализуемое в каждом по своему, при этом, обязать реализовать именно все, что указано в интерфейсе.

Это задача абстрактного класса, а не интерфейса. Интерфейс же в первую очередь предназначается для описания взаимодействий между классом и клиентским кодом. Он описывает функциональные возможности который должны быть у класса что бы клиентский код корректно работал.
Ответ написан
Комментировать
@nexus478
Т.е. могу сделать вывод, что интерфейс в сущности своей, предназначен скорее для удобства и организации в структурах различных классов, т.е. дать им общее, но реализуемое в каждом по своему, при этом, обязать реализовать именно все, что указано в интерфейсе.
Надеюсь, вопрос понятен, и возможно я сам на него и ответил, но все же, хочу быть уверенным в том, что мои выводы верны, дабы в будущем не попасть в нелепую ситуацию.
Если мои доводы неверны, прошу грамотно объяснить смысл и область применения интерфейсов.

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

Интерфейс позволяет переключаться между реализациями, когда меняется контекст, при этом клиент интерфейса от этого контекста не зависит, можно сказать, что интерфейс позволяет отгораживаться от переменчивого контекста. А обязательство реализации требуется для того, чтобы гарантировать клиенту интерфейса, что он получит нужные данные.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы