Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > chingachgoog

Оценить эту запись

Полиморфизм

Запись от 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.
Что тут видно? Ну да - имеются два метода с одинаковым НАЗВАНИЕМ. Да, поведение методов разное.
Интерфейс (т.е. жесткая проверка компилятора) следит за тем, чтобы кто-нибудь из программистов не забыл добавить этот метод в класс
(ничего более иного интерфейс не предлагает в принципе и никоим боком к полиморфизму не относится).
А где полиморфизм-то? Где пример, что экземпляр подкласса используется ВМЕСТО экземпляра суперкласса? Нет такого примера.
А может у Мука такой пример есть? (см. выше. Это с.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

Комментарии

Старый 03.04.2009 19:17 iNils вне форума
iNils
 
Аватар для iNils
Был такой код
Код AS3:
...
var my:MyClass = new MyClass ();
var r:Number = my.getRotation ();
...
Стал такой код
Код AS3:
...
var my:AnotherMyClass = new AnotherMyClass ();
var r:Number = my.getRotation ();
...
Использовали экземпляр суперкласса, вместо него стали использовать экземпляр подкласс.
Старый 03.04.2009 19:44 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Цитата:
Использовали экземпляр суперкласса, вместо него стали использовать экземпляр подкласс.
Ну где же ВМЕСТО? Это вовсе не вместо.

Был суперкласс-прародитель - дедка. Дедка умел сажать репку и вытягивать ее. У дедки есть подкласс - внучка, студентка МГУ, она умеет интегралы считать. Но полиморфизм предполагает, что ВМЕСТО дедки вытянуть репку может и внучка, а вовсе не то, что внучка ВМЕСТО вытягивания репки посчитает дедке интеграл.

Возращаясь к измененному коду __etc.
Вот когда экземпляр my:AnotherMyClass даст при вызове метода getRotation результат, когда как он был бы экземпляром класса MyClass (т.е. результат 100, а не 50), вот тогда это и будет полиморфизм.
Старый 03.04.2009 20:55 iNils вне форума
iNils
 
Аватар для iNils
Полиморфизм - это один интерфейс, множество реализаций. У класса A одна реализация, у B другая, какую нам надо было.
Учи теорию, а не придумывай свою.
Старый 04.04.2009 01:41 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Цитата:
Полиморфизм - это один интерфейс, множество реализаций. У класса A одна реализация, у B другая, какую нам надо было.
iNils, вообще это был стеб над апломбными заявлениями, что полиморфизма нет в AS1, а заодно стеб на Муком и убогом понимании полиморфизма как перегрузки имени (да еще некоторые предлагают контролировать себя интерфейсами).

Цитата:
Учи теорию, а не придумывай свою.
Я учу теорию. И всем советую.
Полиморфизм тут очень показателен.
По этому вопросу вообще нет единогласия.
Хотя мне нравится классификация Бадда
http://grizlyk1.narod.ru/badd/14.htm

То о чем писал __etc, говоришь ты и неуклюже пытался представить Мук - это всего лишь полиморфность (множество) имени функции (метода). Функций много, а имя у всех одно. Можно поставить компилятор сторожевым псом - задать интерфейс. А можно и не ставить - суть не изменится. Тут даже наследование не при чем. Это всего лишь один из частных случаев полиморфизма.

Отсюда есть невероятная глупость заявлять, что полиморфизма нет в AS1. Полиморфизм вообще мало от языка зависит. Это уровень продуманности самого кода. Его алгоритма. Полиморфизм достижим даже в языках не являющимися ООП языками.
Старый 04.04.2009 01:52 iNils вне форума
iNils
 
Аватар для iNils
Битва с мельницами продолжается.
Старый 06.05.2009 22:37 Котяра вне форума
Котяра
 
Аватар для Котяра
А что такое полиморфность (множество) имени функции класса, как не изменение его поведения в отличии от предков в связи с обстоятельствами? Какими двигательными органами, рецепторами итп еще обладает класс? ЧТО ЗА ЧУШЬ? Полиморфность органов это и есть полиморфизм объекта.
Т.е. изменение руки на крыло - это и есть развитие эволюционного (полиморфического) развития объекта. Революция - это создать новый класс или добавить новый метод.
Старый 06.05.2009 23:29 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Котяра, хотелось бы выслушать вашу версию процитированного мною абзаца из Мука. Особенно этого:

Цитата:
любой объект можно рассматривать как экземпляр собственного класса или как экземпляр любого из его суперклассов.
Старый 07.05.2009 19:48 Котяра вне форума
Котяра
 
Аватар для Котяра
Курица является объектом класса куриных, также объектом класса пернатых, также объектом класса позвоночных.
Старый 07.05.2009 21:20 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Замечательно!
Цитата:
Курица является объектом класса куриных, также объектом класса пернатых, также объектом класса позвоночных.
Только одна беда - AS не поддерживает абстрактных классов. Курица - объект конкретный,т.е. при команде
Код:
new Курица()
мы точно знаем, что за зверюшка выйдет. А что выйдет по командам
Код:
new Пернатое()
new Позвоночное()
? Сколько ножек у него будет? Какого цвета? Что за неведома зверушка?

Я понимаю, почему вы не взяли мой пример с дедкой и внучкой. Ну возьмите тогда пример __etc. Там конкретный класс, а не абстракция. И взяв этот пример объясните то, что в цитате Мука я выделил. Т.е. каким образом объект класса AnotherMyClass можно рассматривать как объект класса MyClass (как о том вещает Мук). Ибо если Мук прав, то объект класса AnotherMyClass вернет (когда нам надо) при методе getRotation ту величину как если бы он был объектом класса MyClass. В AS1 такое, конечно, сделать не очень трудно, но как быть с AS3?

PS
Бедный сэр Дарвин даже не представлял как он своей теорией запутает жизнь программистам. А ведь до самой смерти ему так и не удалось доказать свою ТЕОРИЮ (эволюции) и до сих пор она не доказана. (Дарвин был честным парнем и прямо сказал, что только нахождение промежуточных форм сможет подтвердить его теорию - а их-то до сих пор не нашли)
Старый 09.05.2009 01:21 Котяра вне форума
Котяра
 
Аватар для Котяра
Я не говорил об абстрактных классах, вернее так: курица является объектом класса курица, реализующий интерфейс пернатые, который в свою очередь реализует интерфейс позвоночные.
либо: курица является объектом класса курица,который перекрыл (override) некоторые методы класса археоптерикса, который тоже перекрыл и добавил свои, у класса ящеров.
Цитата:
Само по себе слово "полиморфизм" буквально обозначает "множество форм" - любой объект можно рассматривать как экземпляр собственного класса или как экземпляр любого из его суперклассов.
в данном случае курица переопределяет методы археоптерикса и ящера, но непереопределенные методы. вроде как наличие 2 глаз, 4 конечностей итп - остаются.
Другое дело что, более тонкое вникание в реальное наследование и эволюцию живых форм, порождает кучу вопросов. ООП использует терминалогию Дарвинизма (не самого Дарвина, который, кстати приобретенные признаки экземпляра,тоже считал в одной из своих теорий влияющими на последующую наследовательность)
Ваш пример, я просто не понял.
т.е. если у класса куриц getRotation глаз в 2 раза меньше чем у археоптерикса, вы хотите у отдельно взятой курицы вращать глаза в 2 раза быстрее))))
А зачем?
Выростите новую породу кур, установите ей вращение глаз, создайте ферму и вращайте на здоровье))
Старый 09.05.2009 03:05 Котяра вне форума
Котяра
 
Аватар для Котяра
Да и вообще, правда, не понимаю тему этого топика? так потроллить? Неужели, в школе не учили, что такое полиморфизм?
Старый 12.05.2009 13:49 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Котяра, школьные зубрильные "истины" меня не интересуют. Тому кто хочет знать об полиморфизме больше, я дал ссылку на Бадда (см. выше). Этой же ссылки достаточно для того, чтобы оценить высокомерные заявления некоторых, типа:
"полиморфизм в 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
Старый 15.03.2012 18:35 kackbip вне форума
kackbip
 
Аватар для kackbip
Цитата:
Что такое "троллить" я не знаю. Не силен в этом жаргоне.
Здесь-то все и открылось.

Цитата:
Но в этом случае экземпляр курица_Ряба должен выполнять метод getRotation в точности также как и экземпляр археоптерикс_Ряба (когда нам надо)! Однако метод getRotation у класса Курица переписан. Как быть?
Отношение "является" означает, что объект имеет описанные методы и свойства. Но при этом каждый из методов может работать как ему вздумается. Полиморфизм никак не влияет на скорость вращения глазами. Также полиморфизм вовсе не подразумевает вызов метода базового класса.

Еще было бы здорово, если бы вы узнали что такое "поведение" объекта.


Как же этот блог вылез в топ на главной? Жесть...
Обновил(-а) kackbip 15.03.2012 в 18:45
Старый 15.03.2012 22:30 alexcon314 вне форума
alexcon314
kackbip, оппонент, видимо, не сможет вам ответить (какая жалость!), так что не напрягайтесь особо.
ЗЫ. эхх..да-а-а.. сла-а-авный был когда-то холиварчик..AVM1 vs AVM2
Старый 16.03.2012 02:50 alatar вне форума
alatar
 
Аватар для alatar
Цитата:
Как зачем? А затем, что дядя Мук так сказал!
Дядя Мук, конкретно сказал это:
Код AS3:
var my:MyClass = new AnotherMyClass ();
Остальное ваши фантазии.
Старый 23.01.2013 16:31 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Я вот читаю старые блоги и знаете, что-то манера повествования Чинга о AVM1 очень напоминает Мавроди о МММ.
Старый 23.01.2013 17:04 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Psycho Tiger, помню, несколько раз твои перечитывал, про сиськи
Старый 24.01.2013 21:23 strangedk вне форума
strangedk
 
Аватар для strangedk
Ох как я люблю просто пролистывать дальше, когда начинаются невероятные ассоциации про репку и куриц.

Даже не так. Самая первая ассоциация еще понятна. А вот когда остальные участники дискуссии начинают её развивать, получается каша, которую невозможно ни читать ни понимать.
 

 


Часовой пояс GMT +4, время: 00:05.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.