Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интерфейсы, вопрос для FAQ 
:(
    Опции темы
Medved
Дата 22.12.2004, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Собственно кто может подоходчивей объяснить ситуации, когда и где необходимо использовать интерфейсы в реальной практике программирования?

P.S. Под интерфейсами подразумевается конструкция языка, которая содержит список объявлений методов и свойств, а не UI. Это для тех, кто не понял суть вопроса.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
AntonSaburov
Дата 22.12.2004, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Очень удобно это использовать в обработчиках событий.

Например та же кнопка. Она ловит событие "Нажали".
У этой кнопки есть список объектов, которые хотели бы знать о том, что ее нажали.

Делать все эти объекты производными от одного класса - скверная идея.
А вот заставить их всех реализовать интерфес "КнопкаНажата" (в котором может быть всего один метод) удобно.

Т.е. теперь кнопке можно отдать любые виды объектов. Единственное, что от них требуется, чтобы они реализовали интерфейс "КнопкаНажата".

Теперь кнопка содержит список объектов и как только ее нажмут она может все эти объекты привести к интерфейсу "КнопкаНажата" (и это не вызовет каких-либо проблем, ведь эти объекты это делают) и вызвать каждый объект передав в виде объекта нужную информацию.

Например для более сложного события "ДвижениеМышки" можно передать:
- над кем двигали мышкой
- какие координаты теперь у мышки

Ну и так далее.
PM MAIL WWW ICQ   Вверх
Medved
Дата 22.12.2004, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Спасибо Антон.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Domestic Cat
Дата 22.12.2004, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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 на твой вопрос.


--------------------

PM   Вверх
Medved
Дата 22.12.2004, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Это на английском. Я конечно могу понять общий смысл, но это не совсем то, что я спрашивал. Просьба была именно в доступности для нашего своковского человека. Расчитан ответ должен быть для новичка. Просто я попробывал объяснить человеку, что такое интрефейсы, но не совсем понятно у меня получилось. Вообщем как собака. Все понимаю, а объяснить (сказать) не могу. Вот и хотелось бы услышать нормальное объяснение, на уровне учебников для ПТУ. Чтобы я пересказав его даже непрофессиональному программисту (программирующему в дельфи на уровне обработчиков событий), мог объяснить что это такое и когда их лучше использовать.

Добавлено @ 18:35
В свое время, Вит очень хорошо объяснил, что такое классы и объекты. Приведя аналогию с кулинарной книгой. Вот хотелось бы услышать что-то подобное. У самого ничего в голову не приходит. Чтобы было просто, но и в месте с тем понятно.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Domestic Cat
Дата 22.12.2004, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Ну я попытаюсь вкратце объяснить смысл статьи.
1. Наследование от класса позволяет наследующенму классу получить реализацию методов и полей суперкласса.
Например, если у класса Х есть не абстрактный не приватный метод ххх(), то класс, наследующий от Х получит этот метод в наследство, то есть сможет им пользоваться как своим.
В С++, где возможно наследование от нескольких классов одновременно, это дает проблему
( "diamond problem" ) - если классы А и Б наследуют от Х, и определяют оба метод ххх(); и класс С наследует от А и Б, то если он будет вызывать метод ххх(), какой метод будет вызван? Если у класса Х есть поле ааа, то и А и Б получают копию этого поля. Какую копию получит класс С?
В С# наследование возможно только от 1 класса и скольки угодно интерфейсов. Но: интерфейс не определяет реализации методов. Потому diamond problem в и Java/С# не существует.

2. Интерфейсы дают "больсе" полиморфизма. Что такое полиморфизм? Пусть есть класс Животное, от него наследуют классы Кот и Собака. Оба переопределяют метод говори(). (кот говорит "мяу", собака - "гав"). Это дает возможность передавать объекты этих классов в один и тот же метод: например, поместим 10 котов и собак в к-либо контейнер, а затем будем их по очереди передавать в метод
Код
петь(Животное а) {
    а.говорить();
}

Проблема в том, что если мы хотим подключить к концерту, например, Синтезатор, его придется наследовать от класса Животное (или выкручиваться по-другому, но тем самым усложнять код).
Выход: интерфейс. Наследование от класса - это ЖЕСТКАЯ структура, если твой класс зависит от 5 остальных классов (он наследует от одного, тот - от второго и т п) то изменить наследование этого класса означает переписывать много кода - ведь с изменением наследования пропадают все унаследованные методы и поля! Например, Синтезатор наследует от Животное. Если теперь мы посчитаем что это неправильно и уберем такое наследование, то у Синтезатора пропадут все методы класса Животное.
Потому к наследованию от классов нужно подходить очень аккуратно, оно может быть оправдано только серьезными причинами.
Интерфейс скорее означает к-либо СВОЙСТВО, его часто так и называют по-английски. Например в Java ест интерфейс Runnable, что означает что все наследующие от этого интерфейса классы могут быть запущены (методом run()). В нашем случае мы бы определили интерфейс Talkative, и от него могли бы наследовать какие угодно классы - Животное, Радио, ТВ, итп.
Интерфейс дает больше гибкости, он означает свойство, тогда как класс означает тип. Это больше приближено к реальному миру; например все что продается в магазине, имеет цену, но это скорее соответствует тому что товар можно продать (он Продаваемый), чем то, что все товары должны наследовать от одного и того же класса.

3. Помимо наследования, классы можно связать отношением композиции, например
Код

class Fruit {

    //...
}

class Apple {

    private Fruit fruit = new Fruit();
    //...
}


Это иногда выгоднее чем наследование, т.к. такие классы легче менять.
Неудобство - теряется полиморфизм.
С исопльзованием интерфейсов мзохно применять композицию, не теряя полиморфизма:
Код

interface Peelable {
    int peel();
}

class Fruit {
    public int peel() {
        System.out.println("Peeling is appealing.");
        return 1;
    }
}

class Apple implements Peelable {
    private Fruit fruit = new Fruit();
    public int peel() {
        return fruit.peel();
    }
}

class FoodProcessor {
    static void peelAnItem(Peelable item) { // <=== Peelable !
        item.peel();
    }
}

class Example {

    public static void main(String[] args) {
        Apple apple = new Apple();
        FoodProcessor.peelAnItem(apple);
    }
}

class Banana implements Peelable {
    private Fruit fruit = new Fruit();
    public int peel() {
        return fruit.peel();
    }
}




--------------------

PM   Вверх
Domestic Cat
Дата 22.12.2004, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Еще от себя:
Наследование от класса характеризуется глаголом "есть".
Например если класс Б наследует от класса А, то можно сказать что Б есть А.
(Кот это Животное, БМВ есть Машина).
Наследование от интерфейса характеризуется словами "обладает свойством", или причастием.
В случае с Синтезатором было бы неестественно сказать что Синтезатор есть Животное,
естественнее было бы сказать что Синтезатор обладает способностью Говорить. Это позволяет
выделять одинаковые "способности" у совершенно различных объектов, и пользоваться полиморфизмом.


--------------------

PM   Вверх
chipset
Дата 23.12.2004, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 1
Всего: 165



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

Без интерфейсов, нам нужно было бы делать тысячи вариантов выходных/входных отверстий(назовем эту конструкцию - шлюзом) чтобы предусмотреть все возможные комбинации спутник->шлюз->спутник.

Но программеры поступают гораздо хитрее, они просто рисуют стандарт соединения спутников, который описывает всевозможные пазы и торчки. Таким образом, ты конструируешь свой корабль таким образом чтобы форма места соединения была по стандарту. Ну собственно ты и можешь не заботиться о размере, весе, толщине бара в кухне корабля ты твердо знаешь что место соединения у ВСЕХ кораблей ТОЧНО ТАКОЕ ЖЕ как описано в стандарте.

Собственно стандарт соединения и есть интерфейс smile.
Кароче, интерфейс - соглашение о том какие твой класс предоставляет функции, поэтому другой класс только их и пользует и его не колышет ЧТО спрятано ВНУТРИ функций... Его волнует только протопип функций.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Domestic Cat
Дата 23.12.2004, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата(chipset @ 22.12.2004, 15:57)
Кароче, интерфейс - соглашение о том какие твой класс предоставляет функции, поэтому другой класс только их и пользует и его не колышет ЧТО спрятано ВНУТРИ функций... Его волнует только протопип функций.


Но так можно охарактеризовать любой интерфейс, не обязательно только ту самую структуру в Java/C#. Когда ты написал класс с 5 паблик и 20 приват методами, ты уже предоставил интерфейс для других разработчиков. Аналогичным образом, любой абстрактный класс также предоставляет интерфейс. Любой класс с виртуальными (С++) или паблик/протектед (Java) методами также дает аналогичные возможности. smile


--------------------

PM   Вверх
chipset
Дата 23.12.2004, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 1
Всего: 165



Цитата(Domestic @ 22.12.2004, 15:14)

Но так можно охарактеризовать любой интерфейс, не обязательно только ту самую структуру в Java/C#.

Ияжочём... smile)


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
DeadProger
Дата 30.12.2004, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 30.12.2004
Где: The Earth

Репутация: нет
Всего: нет



Domestic Cat, а как реализовать эту функцию peel?
Для каждого класса свою?????????

Это сообщение отредактировал(а) DeadProger - 30.12.2004, 22:05
PM MAIL   Вверх
Domestic Cat
Дата 30.12.2004, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата(DeadProger @ 30.12.2004, 13:03)
Domestic Cat, а как реализовать эту функцию peel?
Для каждого класса свою?????????


Да.


--------------------

PM   Вверх
Medved
Дата 31.12.2004, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Спасибо.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.