| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Полиморфизм |
| Автор: kurzon 6.10.2007, 20:08 |
| Только у интерфейсах есть Полиморфизм? |
| Автор: Kuvaldis 6.10.2007, 20:32 |
| kurzon, Полиморфизм есть только у классов, которые интерфейс реализуют (а могут и не реализовывать Полиморфизм может быть у объектов в памяти. Причем значит это, что они будут РЕАГИРОВАТЬ на определеные вызовы (методы) по своему, но имена этих вызовов - одинаковые А сам интерфейс - это набор абстрактных методов (и свойств) невозможно создать объект интерфейса, нету реализации. |
| Автор: marcusmae 6.10.2007, 20:46 |
| Э, нет. [Зд. и далее не претендую на академическую точность. Изложение своими словами.] Полиморфизм (poly - много, morphema - форма). Соединив эти два корня, можно предположить, что полиморфизмом обладает пара классов, удовлетворющих одинаковой спецификации (интерфейсу), но, имеющие, возможно разные реализации этого интерфейса. Так что полиморфизм выражается именно в классах, а интерфейсы - следствие этой возможности. Например, в C++ нет интерфейсов, но полиморфизм прекрасно себе живёт и действует. |
| Автор: tol05 6.10.2007, 21:25 |
Интерфейсы - такие же типы данных, как и классы. Просто они не содержат полей, но содержат таблицы методов, по которым и маршрутиризуется вызов метода. Создать объект интерфейса нельзя, ну и что? Создать объект абстрактного касса тоже нельзя, но через ссылку абстрактного типа (ссылающуюся на объект-наследник от этого абстрактного типа) как раз полиморфные вызовы и происходят. А абстрактный класс (как известно) - тоже нечто вроде интерфейса. Пока в .Net не ввели интерфейсы, только через абстрактные классы и можно было реализовать наследование интерфесов. Явная реализация интерфейсов предусматривает вызов метода через интерфейс, через переменную интерфейса. Ремоутинг часто использует вызов через интерфейс. Одним словом, интерфейсы как раз и обеспечивают полиморфизм чистого вида. Идеальный полиморфизм. |
| Автор: mr.DUDA 6.10.2007, 22:54 |
| tol05, не соглашусь. Вот в дотнете (как и в С++) есть такая штука как виртуальные методы, и можно её юзать в обычных не-абстрактных классах. Класс А объявляет виртуальный метод, класс-наследник Б его переопределяет, пользователь создаёт экземпляр либо А либо наследника и вызывает конкретную реализацию метод через ссылку на базовый класс А. Это что - не полиморфизм? |
| Автор: tol05 6.10.2007, 23:06 |
| Полиморфизм. Но виртуальный метод можно переопределнить, а можно - не переопределить. Допустим, метод не переопределен. Тогда вызывается метод базового класса, так же, как если бы метод был не виртуальным (и не перекрытым с помощью new). Таким образом, полиморфизм условен. Скажем так, и не наследование, и не полиморфизм. Не зря же Керниган говорил (если не ошибаюсь), что visual C++ убил ООП своими многочисленными уступками и отступлениями от правил. Интерфейсы обязывают переопределять методы - значит полиморфизм в чистом виде будет работать. Обязательный полиморфизм. И смотря что понимать под полиморфизмом. Вызов поведения в зависимости не от типа объявленной ссылки, а от типа присвоенного ей объекта? Тогда только интерфейс это гарантирует. Потому что в наследнике класса можно просто забыть переопределить метод... и все, вызовется реализация базового класса и ... всем ожиданиям. Интерфейс гарантирует, что для вызова метода объекта не нужно писать реализации в базовом классе (не всегда понятно какой ). И если в базовом типе нет никакой реализации, а что-то работает - это и есть полиморфизм. |
| Автор: marcusmae 6.10.2007, 23:54 |
| Возможно, в некоторых аспектах интерфейсы призваны заменить множественное наследование. В этом смысле C# стал строже и специализированее плюсов с их , но, увы, это сильно поубавило в том числе гибкости полиморфизма. То, что , наверно с кем-то и случается (можно и конструктор забыть написать), но этот "недостаток" явно не очень весомый по отношению к преимуществам, которые даёт "условный полиморфизм". С перегрузками можно хоть на ушах стоять, лишь бы самому было удобно. В общем, меняю интерфейсы на множественное наследование. Кто со мной? |
| Автор: Kuvaldis 7.10.2007, 00:40 | ||
marcusmae,
Мдя... А это ж наследование реализации, а не интерфейсов: слишком сильная зависимость. А если нет исходных кодов? (это я про С++) |
| Автор: Deja_Vu 8.10.2007, 16:02 |
| Полиморфизм - значит есть некоторые объекты, на которые можно воздействовать одинакова... Т.е. интерфейсы если у них если не идентичны, то очень схожи.. ((- |
| Автор: mr.DUDA 8.10.2007, 18:03 | ||
http://ru.wikipedia.org/wiki/Полиморфизм_в_языках_программирования на википедии:
|
| Автор: marcusmae 8.10.2007, 19:48 |
Да-да, и я туда смотрел перед тем как пост написать. Теперь вижу, что недосмотрел : весьма значимо слово взаимозаменяемость. |