![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
Собственно кто может подоходчивей объяснить ситуации, когда и где необходимо использовать интерфейсы в реальной практике программирования?
P.S. Под интерфейсами подразумевается конструкция языка, которая содержит список объявлений методов и свойств, а не UI. Это для тех, кто не понял суть вопроса. -------------------- |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 6 Всего: 118 |
Очень удобно это использовать в обработчиках событий.
Например та же кнопка. Она ловит событие "Нажали". У этой кнопки есть список объектов, которые хотели бы знать о том, что ее нажали. Делать все эти объекты производными от одного класса - скверная идея. А вот заставить их всех реализовать интерфес "КнопкаНажата" (в котором может быть всего один метод) удобно. Т.е. теперь кнопке можно отдать любые виды объектов. Единственное, что от них требуется, чтобы они реализовали интерфейс "КнопкаНажата". Теперь кнопка содержит список объектов и как только ее нажмут она может все эти объекты привести к интерфейсу "КнопкаНажата" (и это не вызовет каких-либо проблем, ведь эти объекты это делают) и вызвать каждый объект передав в виде объекта нужную информацию. Например для более сложного события "ДвижениеМышки" можно передать: - над кем двигали мышкой - какие координаты теперь у мышки Ну и так далее. |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
Спасибо Антон.
-------------------- |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Pegas, хотя эта статья иz JavaWorld:
http://www.javaworld.com/javaworld/jw-12-1...techniques.html поскольку суть интерфейсов в Java и NET одна и та же, думаю она даеt отвеt на твой вопрос. -------------------- |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
Это на английском. Я конечно могу понять общий смысл, но это не совсем то, что я спрашивал. Просьба была именно в доступности для нашего своковского человека. Расчитан ответ должен быть для новичка. Просто я попробывал объяснить человеку, что такое интрефейсы, но не совсем понятно у меня получилось. Вообщем как собака. Все понимаю, а объяснить (сказать) не могу. Вот и хотелось бы услышать нормальное объяснение, на уровне учебников для ПТУ. Чтобы я пересказав его даже непрофессиональному программисту (программирующему в дельфи на уровне обработчиков событий), мог объяснить что это такое и когда их лучше использовать.
Добавлено @ 18:35 В свое время, Вит очень хорошо объяснил, что такое классы и объекты. Приведя аналогию с кулинарной книгой. Вот хотелось бы услышать что-то подобное. У самого ничего в голову не приходит. Чтобы было просто, но и в месте с тем понятно. -------------------- |
|||
|
||||
| Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Ну я попытаюсь вкратце объяснить смысл статьи.
1. Наследование от класса позволяет наследующенму классу получить реализацию методов и полей суперкласса. Например, если у класса Х есть не абстрактный не приватный метод ххх(), то класс, наследующий от Х получит этот метод в наследство, то есть сможет им пользоваться как своим. В С++, где возможно наследование от нескольких классов одновременно, это дает проблему ( "diamond problem" ) - если классы А и Б наследуют от Х, и определяют оба метод ххх(); и класс С наследует от А и Б, то если он будет вызывать метод ххх(), какой метод будет вызван? Если у класса Х есть поле ааа, то и А и Б получают копию этого поля. Какую копию получит класс С? В С# наследование возможно только от 1 класса и скольки угодно интерфейсов. Но: интерфейс не определяет реализации методов. Потому diamond problem в и Java/С# не существует. 2. Интерфейсы дают "больсе" полиморфизма. Что такое полиморфизм? Пусть есть класс Животное, от него наследуют классы Кот и Собака. Оба переопределяют метод говори(). (кот говорит "мяу", собака - "гав"). Это дает возможность передавать объекты этих классов в один и тот же метод: например, поместим 10 котов и собак в к-либо контейнер, а затем будем их по очереди передавать в метод
Проблема в том, что если мы хотим подключить к концерту, например, Синтезатор, его придется наследовать от класса Животное (или выкручиваться по-другому, но тем самым усложнять код). Выход: интерфейс. Наследование от класса - это ЖЕСТКАЯ структура, если твой класс зависит от 5 остальных классов (он наследует от одного, тот - от второго и т п) то изменить наследование этого класса означает переписывать много кода - ведь с изменением наследования пропадают все унаследованные методы и поля! Например, Синтезатор наследует от Животное. Если теперь мы посчитаем что это неправильно и уберем такое наследование, то у Синтезатора пропадут все методы класса Животное. Потому к наследованию от классов нужно подходить очень аккуратно, оно может быть оправдано только серьезными причинами. Интерфейс скорее означает к-либо СВОЙСТВО, его часто так и называют по-английски. Например в Java ест интерфейс Runnable, что означает что все наследующие от этого интерфейса классы могут быть запущены (методом run()). В нашем случае мы бы определили интерфейс Talkative, и от него могли бы наследовать какие угодно классы - Животное, Радио, ТВ, итп. Интерфейс дает больше гибкости, он означает свойство, тогда как класс означает тип. Это больше приближено к реальному миру; например все что продается в магазине, имеет цену, но это скорее соответствует тому что товар можно продать (он Продаваемый), чем то, что все товары должны наследовать от одного и того же класса. 3. Помимо наследования, классы можно связать отношением композиции, например
Это иногда выгоднее чем наследование, т.к. такие классы легче менять. Неудобство - теряется полиморфизм. С исопльзованием интерфейсов мзохно применять композицию, не теряя полиморфизма:
-------------------- |
||||||
|
|||||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Еще от себя:
Наследование от класса характеризуется глаголом "есть". Например если класс Б наследует от класса А, то можно сказать что Б есть А. (Кот это Животное, БМВ есть Машина). Наследование от интерфейса характеризуется словами "обладает свойством", или причастием. В случае с Синтезатором было бы неестественно сказать что Синтезатор есть Животное, естественнее было бы сказать что Синтезатор обладает способностью Говорить. Это позволяет выделять одинаковые "способности" у совершенно различных объектов, и пользоваться полиморфизмом. -------------------- |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 1 Всего: 165 |
Представь себе спутники. Они должны соединяться вместе чтобы переправить один другому кулинарные книги Вита
Без интерфейсов, нам нужно было бы делать тысячи вариантов выходных/входных отверстий(назовем эту конструкцию - шлюзом) чтобы предусмотреть все возможные комбинации спутник->шлюз->спутник. Но программеры поступают гораздо хитрее, они просто рисуют стандарт соединения спутников, который описывает всевозможные пазы и торчки. Таким образом, ты конструируешь свой корабль таким образом чтобы форма места соединения была по стандарту. Ну собственно ты и можешь не заботиться о размере, весе, толщине бара в кухне корабля ты твердо знаешь что место соединения у ВСЕХ кораблей ТОЧНО ТАКОЕ ЖЕ как описано в стандарте. Собственно стандарт соединения и есть интерфейс Кароче, интерфейс - соглашение о том какие твой класс предоставляет функции, поэтому другой класс только их и пользует и его не колышет ЧТО спрятано ВНУТРИ функций... Его волнует только протопип функций. --------------------
|
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Но так можно охарактеризовать любой интерфейс, не обязательно только ту самую структуру в Java/C#. Когда ты написал класс с 5 паблик и 20 приват методами, ты уже предоставил интерфейс для других разработчиков. Аналогичным образом, любой абстрактный класс также предоставляет интерфейс. Любой класс с виртуальными (С++) или паблик/протектед (Java) методами также дает аналогичные возможности. -------------------- |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 1 Всего: 165 |
Ияжочём... --------------------
|
||||
|
|||||
| DeadProger |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 30.12.2004 Где: The Earth Репутация: нет Всего: нет |
Domestic Cat, а как реализовать эту функцию peel?
Для каждого класса свою????????? Это сообщение отредактировал(а) DeadProger - 30.12.2004, 22:05 |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Да. -------------------- |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
Спасибо.
-------------------- |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |