Полиморфизм
Запись от chingachgoog размещена 03.04.2009 в 15:49
Колин Мук.
Action Script 3.0 для Flash
Подробное руководство.
Глава 6. НАследование.
Полиморфизм и динамическое связывание.
Цитата:
Полиморфизм - это возможность, присущая всем настоящим объектно-оринтированным языкам программирования, которая заключается в том, что экземпляр подкласса может быть использован везде, где допустимо применение экземпляра его суперкласса.
Само по себе слово "полиморфизм" буквально обозначает "множество форм" - любой объект можно рассматривать как экземпляр собственного класса или как экземпляр любого из его суперклассов.
Само по себе слово "полиморфизм" буквально обозначает "множество форм" - любой объект можно рассматривать как экземпляр собственного класса или как экземпляр любого из его суперклассов.
Рассмотрим код, который якобы показывает полиморфизм на AS3 (я его намеренно чуть изменил для упрощения):
http://flasher.ru/forum/showpost.php...&postcount=370
Код:
package { public class MyClass implements IMyClass { public function getRotation():Number { return 100; } } }
Код:
package { public class AnotherMyClass extends MyClass { public override function getRotation():Number { var rotation:Number = super.getRotation(); return rotation/2; } } }
Код:
package { public interface IMyClass { function getRotation():Number; } }
Цитата:
Сообщение от __etc
Итак, три класса, MyClass, AnotherMyClass и интерфейс IMyClass.
Инкапсулирован метод calculateValue, класс AnotherMyClass наследуется от MyClass,
переопределяет метод и использует метод супер-класса,
и все это сверху нафаршировано полиморфизмом (сигнатуры методов совпадают, поведение разное)
в виде интерфейса IMyClass.
Инкапсулирован метод calculateValue, класс AnotherMyClass наследуется от MyClass,
переопределяет метод и использует метод супер-класса,
и все это сверху нафаршировано полиморфизмом (сигнатуры методов совпадают, поведение разное)
в виде интерфейса IMyClass.
Интерфейс (т.е. жесткая проверка компилятора) следит за тем, чтобы кто-нибудь из программистов не забыл добавить этот метод в класс
(ничего более иного интерфейс не предлагает в принципе и никоим боком к полиморфизму не относится).
А где полиморфизм-то? Где пример, что экземпляр подкласса используется ВМЕСТО экземпляра суперкласса? Нет такого примера.
А может у Мука такой пример есть? (см. выше. Это с.156 в книге) Тем более заголовок обязывает. Нет. И у Мука такого примера нет.
Между тем на AS1 полиморфизм (экземпляр подкласса используется ВМЕСТО экземпляра суперкласса) достигается легко и изящно:
Код:
function MyClass () {} MyClass.prototype.getRotation=function(){ return 100 } function AnotherMyClass () {} AnotherMyClass.prototype.getRotation=function(){ var rotation = super.getRotation(); return rotation/2; } AnotherMyClass.prototype.__proto__=new MyClass() z=new AnotherMyClass() trace(z.getRotation()) // используем перезаписанный метод trace(z.__proto__.__proto__.getRotation()) // используем метод суперкласса
Такой пример я уже давал
http://flasher.ru/forum/showpost.php...&postcount=419
Повторить этот пример на AS3 невозможно.
Всего комментариев 18
Комментарии
![]() ![]() |
|
![]() ![]() |
|
Полиморфизм - это один интерфейс, множество реализаций. У класса A одна реализация, у B другая, какую нам надо было.
Учи теорию, а не придумывай свою. |
![]() ![]() |
|
Цитата:
Полиморфизм - это один интерфейс, множество реализаций. У класса A одна реализация, у B другая, какую нам надо было.
Цитата:
Учи теорию, а не придумывай свою.
Полиморфизм тут очень показателен. По этому вопросу вообще нет единогласия. Хотя мне нравится классификация Бадда http://grizlyk1.narod.ru/badd/14.htm То о чем писал __etc, говоришь ты и неуклюже пытался представить Мук - это всего лишь полиморфность (множество) имени функции (метода). Функций много, а имя у всех одно. Можно поставить компилятор сторожевым псом - задать интерфейс. А можно и не ставить - суть не изменится. Тут даже наследование не при чем. Это всего лишь один из частных случаев полиморфизма. Отсюда есть невероятная глупость заявлять, что полиморфизма нет в AS1. Полиморфизм вообще мало от языка зависит. Это уровень продуманности самого кода. Его алгоритма. Полиморфизм достижим даже в языках не являющимися ООП языками. |
![]() ![]() |
|
Битва с мельницами продолжается.
|
![]() ![]() |
|
Курица является объектом класса куриных, также объектом класса пернатых, также объектом класса позвоночных.
|
![]() ![]() |
|
Да и вообще, правда, не понимаю тему этого топика? так потроллить? Неужели, в школе не учили, что такое полиморфизм?
|
![]() ![]() |
|
Котяра, школьные зубрильные "истины" меня не интересуют. Тому кто хочет знать об полиморфизме больше, я дал ссылку на Бадда (см. выше). Этой же ссылки достаточно для того, чтобы оценить высокомерные заявления некоторых, типа:
"полиморфизм в AS1 не достижим", "полиморфизм - это интерфейсы" или "полиморфизм только в ООП". Достижим и в AS1, и интерфейсы тут не при чем и не только в ООП. Тут речь уже не об этом. (В т.ч. понятно, что полиморфизм - далеко не только одинаковость имени с сигнатурой перезаписываемого метода подкласса - это лишь один из частных случаев полиморфизма. Причем легко достигаемый и на AS1 безо всяких implements) Все дело именно в заявление Мука (впрочем и не только у него): Цитата:
... любой объект можно рассматривать ... как экземпляр любого из его суперклассов.
Поэтому вернемся к нашим курицам © Пример с археоптериксом удачный, в отличии от примеров с классом Пернатые и Позвоночные (как я уже говорил, с точки зрения дарвинизма Пернатые - класс абстрактный, тогда как AS не знает абстракции и соорудит без зазрения совести зверюшку-экземпляр класса Пернатые). Цитата:
Ваш пример, я просто не понял.
1) по мотивам кода __etc (см. первое сообщение) где и есть метод getRotation и т.п. 2) по мотивам вашей аналогии класса Курица Впрочем, я не возражаю, если вам так нравится их совместить, то пожалуйста: Цитата:
т.е. если у класса куриц getRotation глаз в 2 раза меньше чем у археоптерикса, вы хотите у отдельно взятой курицы вращать глаза в 2 раза быстрее))))
А зачем? Цитата:
... любой объект можно рассматривать ... как экземпляр любого из его суперклассов.
Т.е. экземпляр курица_Ряба класса Курица можно рассматривать как экземпляр суперкласса Археоптерикс, как если бы это был экземпляр археоптерикс_Ряба. Но в этом случае экземпляр курица_Ряба должен выполнять метод getRotation в точности также как и экземпляр археоптерикс_Ряба (когда нам надо)! Однако метод getRotation у класса Курица переписан. Как быть? Для AS1 решение есть и я его привел. Но Мук пишет про AS3. Не понимаю. Либо есть какое решение на AS3, мне неведомое, когда экземпляр может воспользоваться перезаписанным методом суперкласса (аналогичное решению на AS1). Либо Мук вообще не понимает о чем говорит (повторяет "школьные истины" как зубрилка). Либо (дарю шанс почитателям Мука) это ошибка переводчика. PS Что такое "троллить" я не знаю. Не силен в этом жаргоне. Тема топика, на мой взгляд, раскрыта в самом первом сообщении. |
|
Обновил(-а) chingachgoog 12.05.2009 в 13:52
|
![]() ![]() |
|
Цитата:
Что такое "троллить" я не знаю. Не силен в этом жаргоне.
Цитата:
Но в этом случае экземпляр курица_Ряба должен выполнять метод getRotation в точности также как и экземпляр археоптерикс_Ряба (когда нам надо)! Однако метод getRotation у класса Курица переписан. Как быть?
Еще было бы здорово, если бы вы узнали что такое "поведение" объекта. Как же этот блог вылез в топ на главной? ![]() |
|
Обновил(-а) kackbip 15.03.2012 в 18:45
|
![]() ![]() |
|
kackbip, оппонент, видимо, не сможет вам ответить (какая жалость!), так что не напрягайтесь особо.
ЗЫ. эхх..да-а-а.. сла-а-авный был когда-то холиварчик..AVM1 vs AVM2 |
![]() ![]() |
|
![]() ![]() |
|
Я вот читаю старые блоги и знаете, что-то манера повествования Чинга о AVM1 очень напоминает Мавроди о МММ.
|
![]() ![]() |
|
Psycho Tiger, помню, несколько раз твои перечитывал, про сиськи
![]() |
Последние записи от chingachgoog
- Работа в Цинке с несколькими COM-портами (17.12.2009)
- ASnative. Новые находки. Примеры применения. (02.06.2009)
- Решение проблемы ввода кириллицы на прозрачном фоне (20.05.2009)
- Полиморфизм (03.04.2009)
- Спасибо форуму Флешер.ру! (27.03.2009)