![]() |
А я согласен с dimarik, т.к. меня порой угнетают объяснения и приведения на реальных примерах.
При чем уже не первый раз наблюдаю, что всё начинается более-менее понятно, и вроде бы чтобы объяснить задающему вопрос - но дальше уже 5-6 взрослых кодеров уже сами начинают путаться о том что пишут, хотя в коде легко решили бы эту задачу. Лучше никакой аналогии чем неудачная. |
Есть еще такой момент: о полиморфизме начинают вспоминать (как и о всем другом), когда его нет. А нужен он тогда, когда у вас появляется лес из if'ов. Т.е. когда у вас есть несколько функций внутри которых вы повторяете одно и то же условие - это значит, что вам нужно переделать код так, чтобы это не происходило. Разные языки этого добиваются по-разному, но в любом случае назовут это полиморфизмом.
В AS3 такой механизм обеспечивается через наследование, или интерфейсы. Это помогает выделить отдельные части кода связанные логически в соответствующие им сущности (классы), а другой части кода оставаться универсальной по отношению к ним работать "по контракту" полученному либо от интерфейса, либо из описания класса, что и есть, практически, одно и то же. Пример: Код AS3:
Код AS3:
Полиморфизм, в этом контексте, это неформальный антоним мономорфизма, т.как мономорфизм обязывает, что если f(g(x)) = f(y(x)), то g = y. Т.е., неформально, для существования морфизма обязательным условием является тот факт, что если функции ведут себя одинаково, то это одна и та же функция. Соответственно, в полиморфизме, допускается, что при f(g(x)) = f(y(x)), g != y (что мы и видим в примере с кошкой и собакой - у нас есть две функции, которые ведут себя одинаково, но не равны). |
топикстартер попросил метафору,
все люди разные, некоторым нагляднее код, некоторым примеры из реальной жизни если вы находите мою метафору неудачной - предложите более удачную, или попробуйте объяснить лучше чем это сделал я :) |
Уважаемый wvxvw *( и остальные если есть дельный совет), это вы очень интересно сказали о полиморфизме как сокращении if ов (однотипных действий).
А что вы скажите о такой задачке : Предисловие : Пишу сайт , имеем wrapper для секций. В каждой секции от тех или иных условий , может появится скролл ВСЕГО контента ( находится всегда на одной и той же координате по х ) Чтобы скролл работал ему нужно передать параметры контента, маски, высоты прокрутки и т.п. А вот теперь задача : Если создавать скролл внутри каждой секции ( позиционировать, рисовать и т.п.) , то передать в него параметры и настроить как нужно не составит труда. НО не глупо ли писать однотипный код по рисованию и позиционированию скроллам в каждой секции, когда можно ведь добавить скролл во wrapper ? На первый взгляд, лучше добавить во wrapper... Код AS3:
Как бы делали вы ? Может есть альтернативные варианты :) |
Не уверен что понял проблему, но попробую дать совет
как я понял у вас контейнер управляет параметрами контента. я предлагаю вам создать интерфейс для объектов которые можно вставлять в контейнер и контейнер будет управлять контентом используя этот нитефейрс а контент будет этот интерфейс реализовывать, таким образом контейнер не будет знать как устроен контент, но сможет им управлять для скроллинга контента контейнеру нужно будет уметь узнать высоту контента и иметь возможность изменять вертикальную позицию |
Писать-то скроллер - все равно один раз. Ну а дальше думайте сами: если каждый элемент в контейнере может содержать по скроллеру - возможна ли такая ситуация, когда скроллеров несколько? Нужна ли такая ситуация? Если не нужна, но возможна при таком раскладе, тогда, явно нужно в контейнере делать скроллер.
Если элементы находятся внутри контейнера, они уже почти наверняка однотипные в чем-то. Так что достаточно будет обработать один, и то же самое можно будет применить для всех. Я бы пошел по пути подписывание на события изменения размера у вложенных элементов, и если размер изменился так, что нужно показать скроллер, то, естесственно показывал. Еще, как вариант, если данные в элементы внутри контейнера попадают не из самих элементов, а из какого-то внешнего источника, который может так же сообщить и контейнеру об обновлении данных, и, соответственно, размера, то это бы вообще было идеально, т.как даже подписываться на события не нужно было бы. Контейнер сам бы установил новые свойства, и тут же сам бы проверил нужен скроллер или нет. |
Скроллер может быть только один, поэтому конечно писать лучше во вреппере. wvxvw - про было бы идеально не понял немного о какой ситуации идет речь.
У меня приблизительно щас так : Код AS3:
|
| Часовой пояс GMT +4, время: 10:15. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.