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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полиморфизм 
:(
    Опции темы
kurzon
Дата 6.10.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.8.2007

Репутация: 0
Всего: -11



Только у интерфейсах есть Полиморфизм?
PM MAIL   Вверх
Kuvaldis
Дата 6.10.2007, 20:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

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



kurzon, 
Полиморфизм есть только у классов, которые интерфейс реализуют (а могут и не реализовывать smile )

Полиморфизм может быть у объектов в памяти.  Причем значит это, что они будут РЕАГИРОВАТЬ на определеные вызовы (методы) по своему, но имена этих вызовов - одинаковые

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



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
marcusmae
Дата 6.10.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

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



Э, нет.

[Зд. и далее не претендую на академическую точность. Изложение своими словами.]
Полиморфизм (poly - много, morphema - форма). Соединив эти два корня, можно предположить, что полиморфизмом обладает пара классов, удовлетворющих одинаковой спецификации (интерфейсу), но, имеющие, возможно разные реализации этого интерфейса. Так что полиморфизм выражается именно в классах, а интерфейсы - следствие этой возможности. Например, в C++ нет интерфейсов, но полиморфизм прекрасно себе живёт и действует.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
tol05
Дата 6.10.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



Цитата(Kuvaldis @  6.10.2007,  20:32 Найти цитируемый пост)
Полиморфизм есть только у классов

Интерфейсы - такие же типы данных, как и классы. Просто они не содержат полей, но содержат таблицы методов, по которым и маршрутиризуется вызов метода. 

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

Явная реализация интерфейсов предусматривает вызов метода через интерфейс, через переменную интерфейса. Ремоутинг часто использует вызов через интерфейс. 

Одним словом, интерфейсы как раз и обеспечивают полиморфизм чистого вида. Идеальный полиморфизм.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
mr.DUDA
Дата 6.10.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



tol05, не соглашусь. Вот в дотнете (как и в С++) есть такая штука как виртуальные методы, и можно её юзать в обычных не-абстрактных классах. Класс А объявляет виртуальный метод, класс-наследник Б его переопределяет, пользователь создаёт экземпляр либо А либо наследника и вызывает конкретную реализацию метод через ссылку на базовый класс А. Это что - не полиморфизм?


--------------------
user posted image
PM MAIL WWW   Вверх
tol05
Дата 6.10.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



Полиморфизм. Но виртуальный метод можно переопределнить, а можно - не переопределить. 

Допустим, метод не переопределен. Тогда вызывается метод базового класса, так же, как если бы метод был не виртуальным (и не перекрытым с помощью new). Таким образом, полиморфизм условен. Скажем так, и не наследование, и не полиморфизм. 
Не зря же Керниган говорил (если не ошибаюсь), что visual C++ убил ООП своими многочисленными уступками и отступлениями от правил.

Интерфейсы обязывают переопределять методы - значит полиморфизм в чистом виде будет работать. Обязательный полиморфизм.

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

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

Это сообщение отредактировал(а) tol05 - 6.10.2007, 23:30


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
marcusmae
Дата 6.10.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

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



Возможно, в некоторых аспектах интерфейсы призваны заменить множественное наследование. В этом смысле C# стал строже и специализированее плюсов с их
Цитата(tol05 @  6.10.2007,  23:06 Найти цитируемый пост)
многочисленными уступками и отступлениями от правил
, но, увы, это сильно поубавило в том числе гибкости полиморфизма.

То, что 
Цитата(tol05 @  6.10.2007,  23:06 Найти цитируемый пост)
в наследнике класса можно просто забыть переопределить метод
, наверно с кем-то и случается (можно и конструктор забыть написать), но этот "недостаток" явно не очень весомый по отношению к преимуществам, которые даёт "условный полиморфизм". С перегрузками можно хоть на ушах стоять, лишь бы самому было удобно.

В общем, меняю интерфейсы на множественное наследование. Кто со мной?  smile


Это сообщение отредактировал(а) marcusmae - 7.10.2007, 00:11


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Kuvaldis
Дата 7.10.2007, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

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



marcusmae, 
Цитата

В общем, меняю интерфейсы на множественное наследование. Кто со мной? 

Мдя... А это ж наследование реализации, а не интерфейсов: слишком сильная зависимость. А если нет исходных кодов? (это я про С++)


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
tol05
Дата 7.10.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



Цитата(marcusmae @  6.10.2007,  23:54 Найти цитируемый пост)
В общем, меняю интерфейсы на множественное наследование. Кто со мной?

да нет, не в этом смысл интерфейсов. Я согласен с Kuvaldis и немного поясню его мысль.
Интерфейсы можно применять для множественного наследования, но только множественного наследования интерфейсов, но не для множественного наследования реализаций. Здесь есть разница. 
И эта возможность - не главная. Java и Delphi, как я помню, вообще множественное наследование отрицают, и это никак не влияет на их полиморфные возможности smile

Интрефейс призван отделить реализацию от манифеста (объявления). Как в плюсах файлы декларации, как библиотеки типов COM. Вот в чем фича. Самый яркий пример - ремоутинг. 

Как известно, на стороне сервера нужна программа "сервер" и библиотека "RemObj.dll" с классом удаленного объекта (удаленный объект содержит в своих методах конкретную реализацию). На стороне клиента - программа клиент. Клиент должен создать прокси удаленного объекта и вызвать метод чтобы получить результат. И вот тут два момента. 
Во-первых, клиент должен иметь у себя библиотеку с манифестом удаленного объекта. Но для этого разработчик сервера должен всем клиентам рассылать "RemObj.dll". А это не очень хорошо, раскрывать код.
Во-вторых, разработчик сервера может заменить класс удаленного объекта другим, и тогда нужно изменять всех клиентов.

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

Это сообщение отредактировал(а) tol05 - 7.10.2007, 11:31


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Deja_Vu
Дата 8.10.2007, 16:02 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.6.2007
Где: Казань

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



Полиморфизм - значит есть некоторые объекты, на которые можно воздействовать одинакова...
Т.е. интерфейсы если у них если не идентичны, то очень схожи.. ((-


Это сообщение отредактировал(а) Deja_Vu - 8.10.2007, 16:03
PM Skype   Вверх
mr.DUDA
Дата 8.10.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Статья на википедии:
Цитата
Полиморфизм (в языках программирования) — взаимозаменяемость объектов с одинаковым интерфейсом.

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

Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество методов».



--------------------
user posted image
PM MAIL WWW   Вверх
marcusmae
Дата 8.10.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

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



Цитата(mr.DUDA @  8.10.2007,  18:03 Найти цитируемый пост)
Статья на википедии:

Да-да, и я туда смотрел перед тем как пост написать. Теперь вижу, что недосмотрел : весьма значимо слово взаимозаменяемость.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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