![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
А я согласен с dimarik, т.к. меня порой угнетают объяснения и приведения на реальных примерах.
При чем уже не первый раз наблюдаю, что всё начинается более-менее понятно, и вроде бы чтобы объяснить задающему вопрос - но дальше уже 5-6 взрослых кодеров уже сами начинают путаться о том что пишут, хотя в коде легко решили бы эту задачу. Лучше никакой аналогии чем неудачная.
__________________
adobe AS3 manual |
|
|||||
|
Modus ponens
|
Есть еще такой момент: о полиморфизме начинают вспоминать (как и о всем другом), когда его нет. А нужен он тогда, когда у вас появляется лес из if'ов. Т.е. когда у вас есть несколько функций внутри которых вы повторяете одно и то же условие - это значит, что вам нужно переделать код так, чтобы это не происходило. Разные языки этого добиваются по-разному, но в любом случае назовут это полиморфизмом.
В AS3 такой механизм обеспечивается через наследование, или интерфейсы. Это помогает выделить отдельные части кода связанные логически в соответствующие им сущности (классы), а другой части кода оставаться универсальной по отношению к ним работать "по контракту" полученному либо от интерфейса, либо из описания класса, что и есть, практически, одно и то же. Пример: function feed(animal:Animal):void { if (animal.kind == Animal.DOG) { animal.eat(new DogFood()); } else if (animal.kind == Animal.CAT) { animal.eat(new CatFood()); } else { //... } } function strikeAndListen(animal:Animal):String { var animalSays:String; if (animal.kind == Animal.DOG) { animalSays = "bark"; } else if (animal.kind == Animal.CAT) { animalSays = "purr"; } else { //... } return animalSays; } class Dog extends Animal { public function feed():void { ... } public function strikeAndListen():String { ... } } class Cat extends Animal { public function feed():void { ... } public function strikeAndListen():String { ... } } Полиморфизм, в этом контексте, это неформальный антоним мономорфизма, т.как мономорфизм обязывает, что если f(g(x)) = f(y(x)), то g = y. Т.е., неформально, для существования морфизма обязательным условием является тот факт, что если функции ведут себя одинаково, то это одна и та же функция. Соответственно, в полиморфизме, допускается, что при f(g(x)) = f(y(x)), g != y (что мы и видим в примере с кошкой и собакой - у нас есть две функции, которые ведут себя одинаково, но не равны).
__________________
Hell is the possibility of sanity |
|
|||||
|
топикстартер попросил метафору,
все люди разные, некоторым нагляднее код, некоторым примеры из реальной жизни если вы находите мою метафору неудачной - предложите более удачную, или попробуйте объяснить лучше чем это сделал я ![]()
__________________
Хороший отдых - половина работы. |
|
|||||
|
[+4 06.05.14]
|
Уважаемый wvxvw *( и остальные если есть дельный совет), это вы очень интересно сказали о полиморфизме как сокращении if ов (однотипных действий).
А что вы скажите о такой задачке : Предисловие : Пишу сайт , имеем wrapper для секций. В каждой секции от тех или иных условий , может появится скролл ВСЕГО контента ( находится всегда на одной и той же координате по х ) Чтобы скролл работал ему нужно передать параметры контента, маски, высоты прокрутки и т.п. А вот теперь задача : Если создавать скролл внутри каждой секции ( позиционировать, рисовать и т.п.) , то передать в него параметры и настроить как нужно не составит труда. НО не глупо ли писать однотипный код по рисованию и позиционированию скроллам в каждой секции, когда можно ведь добавить скролл во wrapper ? На первый взгляд, лучше добавить во wrapper... in wrapper ( this.addEventListener(SectionEvent.CHECK_SCROLL , onCheck) ) in Section ( this.dispatchEvent(new SectionEvent(SectionEvent.CHECK_SCROLL , this._content , this._mask , this_way ) ) Как бы делали вы ? Может есть альтернативные варианты ![]()
__________________
Марк Tween |
|
|||||
|
Не уверен что понял проблему, но попробую дать совет
как я понял у вас контейнер управляет параметрами контента. я предлагаю вам создать интерфейс для объектов которые можно вставлять в контейнер и контейнер будет управлять контентом используя этот нитефейрс а контент будет этот интерфейс реализовывать, таким образом контейнер не будет знать как устроен контент, но сможет им управлять для скроллинга контента контейнеру нужно будет уметь узнать высоту контента и иметь возможность изменять вертикальную позицию
__________________
Хороший отдых - половина работы. |
|
|||||
|
Modus ponens
|
Писать-то скроллер - все равно один раз. Ну а дальше думайте сами: если каждый элемент в контейнере может содержать по скроллеру - возможна ли такая ситуация, когда скроллеров несколько? Нужна ли такая ситуация? Если не нужна, но возможна при таком раскладе, тогда, явно нужно в контейнере делать скроллер.
Если элементы находятся внутри контейнера, они уже почти наверняка однотипные в чем-то. Так что достаточно будет обработать один, и то же самое можно будет применить для всех. Я бы пошел по пути подписывание на события изменения размера у вложенных элементов, и если размер изменился так, что нужно показать скроллер, то, естесственно показывал. Еще, как вариант, если данные в элементы внутри контейнера попадают не из самих элементов, а из какого-то внешнего источника, который может так же сообщить и контейнеру об обновлении данных, и, соответственно, размера, то это бы вообще было идеально, т.как даже подписываться на события не нужно было бы. Контейнер сам бы установил новые свойства, и тут же сам бы проверил нужен скроллер или нет.
__________________
Hell is the possibility of sanity |
|
|||||
|
[+4 06.05.14]
|
Скроллер может быть только один, поэтому конечно писать лучше во вреппере. wvxvw - про было бы идеально не понял немного о какой ситуации идет речь.
У меня приблизительно щас так : public class ContentWrapper extends Sprite implements IDestroyable public function init(sectionData:XMLList) { .... } public function openContent(sectionID:int):void { switch(sectionID) case 0: this._section = new PortfolioSection(); break; case 1: this._section = new ContactSection(); break; .... this.addchild(this._section); this._section.init( sectionData["section_" + sectionID] ); this._section.addEventListener(WrapperEvent.CHECK_SCROLL , onCheck); } private function onCheck(e:WrapperEvent):void { if(e.param == "scroll.hide") this._scroll.destroy(); else { this._scroll.define( e.param[1] , e.param[2] ... ) } }
__________________
Марк Tween |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:30. |
|
|
« Предыдущая тема | Следующая тема » |
|
|