|
4 / 4 / 0
Регистрация: 17.05.2011
Сообщений: 262
|
|
Для чего нужны интерфейсы (не GUI)07.09.2011, 05:27. Показов 57243. Ответов 18
Метки нет (Все метки)
Пожалуйста, объясните новичку, для чего нужны интерфейсы! Желательно с простыми примерами для понимания.
1
|
|
| 07.09.2011, 05:27 | |
|
Ответы с готовыми решениями:
18
Для чего нужны универсальные интерфейсы типа IComparable<T> Для чего нужны интерфейсы Для чего нужны интерфейсы? |
|
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
|
|
| 07.09.2011, 08:22 | |
Сообщение было отмечено как решение
Решение
Подобная тема уже обсуждалась. В С++ была возможность множетсвенного наследования. Разработчики C# решили отказаться от этого и придумали интерфейсы. Получается что класс не может быть унаследован от нескольких классов, но при этом унаследовать несколько интерфейсов. Интерфейсы нужны для наследования. Часто необходимо реализовать несколько классов, при этом у них одинаковые методы (название), но по разному должны быть реализованы.
К примеру можно создать несколько классов: круг, квадрат, треугольник. У всех классов необходимо реализовать методы вычисления площади и периметра. Для этого нужно создать интерфейс с двумя методами. После каждый класс унаследует этот интерфейс, и по своему реализует методы.
14
|
|
|
48 / 48 / 1
Регистрация: 29.03.2011
Сообщений: 24
|
|||||||||||||||||
| 07.09.2011, 09:54 | |||||||||||||||||
Сообщение было отмечено как решение
Решениев терминах ООП .NET интерфейс это просто перечисление методов, которые должны быть обязательно реализованы у класса. представьте два класса жена и будильник. Ясно, что у них даже предков общих нет (м.б. только атомы?)) если объявить интерфейс - "iНасилие" с методом Ударить
iНасилие item; // то item = new Жена(); и будет работать item.Ударить() или же item = new Будильни(); и также будет работать item.Ударить(); Т.е. в одном списке, например, можно держать кучу разных объектов. Разных по сути и по предкам. Но с одним и тем же интерфейсом. И ко всем из них в цикле можно применить один и тот же метод. И ты точно знаешь, что если у класса есть такой то интерфейс, то все методы этого интерфейса в нем обязательно реализованы (иначе не скомпилируешь). Множественное наследие более гибкая штука (мне не нравится что ее нет в C#), но зато точно понятно, что невозможно иметь существо-наследник двух классов, будильника+жены. Т.е. в C# это так сказать в относительно безопасной манере реализовано.
45
|
|||||||||||||||||
|
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
|
||||||
| 07.09.2011, 10:07 | ||||||
Сообщение было отмечено как решение
Решение
Интерфейс в практическом смысле дает возможность указать из чего именно должен состоять тот или иной объект разрабатываемой модели без описания поведения объекта.
Например: создадим интерфейс Человек, и укажем основные параметры, которые есть у человека (грубый пример). Далее создадим класс, который реализует этот интерфейс. Видно, что для реализации интерфейса необходимо, чтобы в классе были реализованы все его члены.
Ну как-то так.
7
|
||||||
|
4 / 4 / 0
Регистрация: 17.05.2011
Сообщений: 262
|
|
| 07.09.2011, 10:13 [ТС] | |
|
т.е. интерфейс это в какой-то степени скелет класса?
0
|
|
|
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
|
||
| 07.09.2011, 10:19 | ||
|
2
|
||
|
48 / 48 / 1
Регистрация: 29.03.2011
Сообщений: 24
|
||
| 07.09.2011, 10:21 | ||
|
т.к. в описании интерфейса не может быть полей. Но могут быть методы,свойства, события. Т.е. интерфейс работает "внешним" состоянием предмета, описывая какое поведение у него д.б. Но интерфейс не указывает на внутренности - т.е. на то, как хранить внутреннее состояние объекта (а его хранят в полях). Т.е. все-таки "ядро", это сам класс. А интерфейс, развивающая его "стандартизированная нашлепка". Добавлю, что в теории ООП интерфейсы называются еще соглашениями или контрактами (иногда используется в качестве синонимов в текстах)
1
|
||
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
|
| 07.09.2011, 23:23 | |
|
важно отметить что метода, которые наследуются классом от интерфейса не должны быть закрытыми. в принципе понятно почему - интерфейс должен отображать внешнее поведение объекта, но если мне нужно использовать метод объекта интерфейса в классе, который его наследует, то мне нужно делать этот метод общедоступным чего делать мне не хотелось бы ибо он будет и у классов-наследников. у меня закрадывается мысль что здесь не интерфейс. с абстрактным классом где-то такая же ситуация - я не могу сделать ни абстрактный метод закрытым, ни виртуальный метод закрытым. этого момента я не понимаю. значит мне нужно выносить метод в другой класс и тянуть его оттуда?
большую гибкость дают интерфейсы и абстрактные классы когда вы начинаете проектировать архитектуру приложения или библиотеки, опираясь на паттерны проектирования
0
|
|
|
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
|
||
| 08.09.2011, 00:59 | ||
|
Наследуя класс от какого-нибудь TextBoxBase, я понимаю, что это разветвление в иерархии классов, и я должен либо снова сделать узел (разветвление) то бишь снова создать абстрактный класс, либо завершить это веточкой в виде TextBox.
0
|
||
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
|||
| 08.09.2011, 10:31 | |||
|
вопрос с закрытыми виртуальными методами интересен и неясен - какие преследовались цели, делая только открытыми виртуальные методы? Добавлено через 2 минуты
0
|
|||
|
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
|
||||
| 08.09.2011, 18:09 | ||||
|
1
|
||||
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
||||
| 08.09.2011, 18:15 | ||||
|
0
|
||||
|
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
|
||
| 08.09.2011, 18:18 | ||
|
0
|
||
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
|
| 08.09.2011, 18:22 | |
|
0
|
|
|
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
|
|
| 08.09.2011, 18:25 | |
|
Koran, я через запятую написал. Перечислял, каким можно сделать класс. Либо sealed, либо virtual.
0
|
|
|
|
|||||||||||||||||||||
| 13.11.2012, 00:20 | |||||||||||||||||||||
|
И всётаки))
0
|
|||||||||||||||||||||
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
|
| 13.11.2012, 01:35 | |
|
в данном контексте ничем не отличается, но если тебе нужно реализовать какое-то общее поведение классов, которые в принципе ничего общего не имеют, но имеют (класс Автомобить, класс Планета, класс Монитор, которые ничего не имеют общего казалось бы) общее свойство (поведение) перемещение, но при этом разную реализацию, то проще реализовать интерфейс IMovable с методом moveTo(Point p) но с разной реализацией этого метода, то проще использовать интерфейсы. к тому же, если тебе придется взять пачку этих объектов и переместить их, то ты просто пройдешься по списку этих объектом (IMovable[]) и вызовешь их общий метод moveTo(Point p), то тебе будет пофигу как он реализован, главное, что реализован интерфейс IMovable
и вообще, чтобы лучше понять зачем нужны интерфейсы, почитай какую-то простую книгу по паттерная проектирования, а не просто параграф со справочника, где описывается такая штука, как интерфейс
1
|
|
|
52 / 13 / 0
Регистрация: 05.09.2014
Сообщений: 92
|
|
| 10.11.2015, 18:16 | |
|
Если взглянуть в суть, то просто хотелось бы понять - интерфейсы ОБЯЗАТЕЛЬНЫ ? Они являются скелетами и помогают программистам "не забыть" определить методы для классов, наследующих интерфейсы. Но с точки зрения полезности - что позволяют сделать интерфейсы, чего нельзя сделать без них ? Изучая интерфейсы узнал о не обобщенных списках, то есть которые могут содержать объекты разных типов. Выше писалось, что объявление сигнатуры метода в интерфейсе гарантирует, что в любом из классов, его наследующих, будет реализация этого метода. То есть мы создаем список, который содержит, например, два экземпляра различных классов Планета и Машина. Для каждого из них будет использоваться свой метод Скорость. Первый вариант - мы унаследовали некий интерфейс при определении обоих классов, где объявлена сигнатура метода Скорости, описывая его затем внутри классов и второй вариант - мы просто объявили два класса без наследования и точно также определили метод Скорость в каждом классе. Наследование интерфейса позволяет обратиться к каждому методу объектов внутри списка с помощью цикла, а в случае отсутствия наследования этого сделать нельзя ? Или можно ? Если можно, значит "практического" применения у интерфейсов нет ? То есть это исключительно логический инструмент ?
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 11.11.2015, 02:37 | ||||||
|
В языке со строгой типизацией, где компилятор должен принимать решение о том, является ли вызов определенного метода через определенную переменную легальным, это весьма полезно. Что позволяет сделать C#, чего не позволяют сделать ассемблер или перфокарты? Абстракции — это в первую очередь удобство архитектуры и интеграции, а не голый функционал. Как и молоток, он вовсе не обязателен, но с ним определенные архитектурные задачи решаются намного легче. В качестве практики посмотрите как и где интерфейсы используются во фреймворке и попробуйте хотя бы "на бумажке" решить те же задачи, но без их использования.
4
|
||||||
| 11.11.2015, 02:37 | |
|
Помогаю со студенческими работами здесь
19
Для чего нужны интерфейсы?
Для чего нужен абстрактные классы/интерфейсы?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|