Kioshilol
@Kioshilol
Student

Для чего все-таки нужны интерфейсы?

Не могу понять для чего нужны интерфейсы и как их грамотно юзать?! В интернете написано для того ,что бы один метод описаный в интерфейсе (который подходит к двум классам) использовать.
Почему нельзя этот метод создать так-же в разных классах??
  • Вопрос задан
  • 400 просмотров
Решения вопроса 2
@kova1ev
Представь у тебя есть какой-нибудь метод, который принимает в агрументах объект, например, типа User
doSomething(User user)
Ты можешь передавать в этот метод любой объект типа User или объекты классов, наследующих User.
Но можно сделать еще гибче, например описать некий интерфейс UserInteface и указать в определении метода его:
doSomething(UserInterface user)
Теперь ты можешь передавать в метод объект любого класса, который реализует интерфейс UserInterface.
Разумеется, изначальный класс User из этого примера тоже должен реализовывать этот интерфейс.

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

И, как уже написали выше, один класс может реализовывать несколько интерфейсов.
Ответ написан
Комментировать
Zoominger
@Zoominger
System Integrator
Костыль для множественного наследования.

UPD через день: много бугурта из-за слова "костыль". Хорошо, не костыль, а фича и удобная примочка, облегчающая написание программ на C#. Простити меня, пожалуйста :(
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ivanvorobei
@ivanvorobei
iOS разработчик, канал https://t.me/sparrowcode
Ремонтируем подводную лодку: крепление винта — 16-листовая резьба с 29 дюймами (только что выдумал). Не нужно каждый раз делать новую подводную лодку - нужно заменить винт согласно характеристикам. Какой винт будет - реализация. Необходимые параметры для того, чтобы винт подошел - и есть интерфейс.

Интерфейсы скрывают реализацию в черный ящик.

Более сложный пример: интерфейс добавляет свойства-поведение классу, но не реализует. Колесо может крутиться, но чтобы поменять нипель - нужно реализовать протокол шиномонтаж: в нем бы был указатель на нипель, диаметр, тип резины и т.д. На шиномонтаже бывает много колес, но при условии что колесо реализовало протокол - мастера смогут помочь. А вот с пластиковыми колесами не помогут - нипеля нет, протокол не реализовать.
Ответ написан
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
На самом деле, всё довольно просто: интерфейсы нужны для декомпозиции модели и облегчения разработки ПО. По факту, интерфейс описывает набор операций, который можно совершить над объектом. Если вы пишите какую-то функциональность, то она допустим работает только с теми объектами, над которыми можно совершать определённые действия, а что это за объекты вас не волнует. Буква "I" из набора принципов SOLID про этом, почитайте.

Вот допустим я пишу модуль, который должен стучать, по всему тому, что можно постучать. Есть у меня функция "knock(IKnockable o)" ну и соответствующий интерфейс. Клиенты, кому надо воспользоваться этим модулем, реализуют этот интерфейс в своих классах и пользуются. Но мой модуль вообще ничего не знает об клиентах, он просто работает со всем, что реализует определённый протокол взаимодействия (интерфейс). Это ещё и связанность понижает.
Ответ написан
Ваш ответ на вопрос

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

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