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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.09.2012, 00:48
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 21  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
А я согласен с dimarik, т.к. меня порой угнетают объяснения и приведения на реальных примерах.

При чем уже не первый раз наблюдаю, что всё начинается более-менее понятно, и вроде бы чтобы объяснить задающему вопрос - но дальше уже 5-6 взрослых кодеров уже сами начинают путаться о том что пишут, хотя в коде легко решили бы эту задачу.

Лучше никакой аналогии чем неудачная.
__________________
adobe AS3 manual

Старый 20.09.2012, 02:02
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 22  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Есть еще такой момент: о полиморфизме начинают вспоминать (как и о всем другом), когда его нет. А нужен он тогда, когда у вас появляется лес из if'ов. Т.е. когда у вас есть несколько функций внутри которых вы повторяете одно и то же условие - это значит, что вам нужно переделать код так, чтобы это не происходило. Разные языки этого добиваются по-разному, но в любом случае назовут это полиморфизмом.
В AS3 такой механизм обеспечивается через наследование, или интерфейсы. Это помогает выделить отдельные части кода связанные логически в соответствующие им сущности (классы), а другой части кода оставаться универсальной по отношению к ним работать "по контракту" полученному либо от интерфейса, либо из описания класса, что и есть, практически, одно и то же.

Пример:

Код 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;
}
Напрашивается сделать так:

Код AS3:
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

Старый 20.09.2012, 02:04
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 23  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
топикстартер попросил метафору,
все люди разные, некоторым нагляднее код, некоторым примеры из реальной жизни

если вы находите мою метафору неудачной - предложите более удачную, или попробуйте объяснить лучше чем это сделал я
__________________
Хороший отдых - половина работы.

Старый 20.09.2012, 02:45
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 24  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Уважаемый wvxvw *( и остальные если есть дельный совет), это вы очень интересно сказали о полиморфизме как сокращении if ов (однотипных действий).

А что вы скажите о такой задачке :
Предисловие :
Пишу сайт , имеем wrapper для секций. В каждой секции от тех или иных условий , может появится скролл ВСЕГО контента ( находится всегда на одной и той же координате по х )
Чтобы скролл работал ему нужно передать параметры контента, маски, высоты прокрутки и т.п.
А вот теперь задача :

Если создавать скролл внутри каждой секции ( позиционировать, рисовать и т.п.) , то передать в него параметры и настроить как нужно не составит труда. НО не глупо ли писать однотипный код по рисованию и позиционированию скроллам в каждой секции, когда можно ведь добавить скролл во wrapper ?
На первый взгляд, лучше добавить во wrapper...

Код AS3:
in wrapper ( this.addEventListener(SectionEvent.CHECK_SCROLL , onCheck)  )
in Section  ( this.dispatchEvent(new SectionEvent(SectionEvent.CHECK_SCROLL , this._content , this._mask , this_way ) )
Так вот, что с одной стороны некрасиво, что с другой . ( пугает именно большая передача, казалось бы, не нужных врапперу данных)
Как бы делали вы ? Может есть альтернативные варианты
__________________
Марк Tween

Старый 20.09.2012, 03:02
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 25  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
Не уверен что понял проблему, но попробую дать совет

как я понял у вас контейнер управляет параметрами контента.
я предлагаю вам создать интерфейс для объектов которые можно вставлять в контейнер
и контейнер будет управлять контентом используя этот нитефейрс
а контент будет этот интерфейс реализовывать,
таким образом контейнер не будет знать как устроен контент, но сможет им управлять

для скроллинга контента контейнеру нужно будет уметь узнать высоту контента и иметь возможность изменять вертикальную позицию
__________________
Хороший отдых - половина работы.

Старый 20.09.2012, 03:28
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 26  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Писать-то скроллер - все равно один раз. Ну а дальше думайте сами: если каждый элемент в контейнере может содержать по скроллеру - возможна ли такая ситуация, когда скроллеров несколько? Нужна ли такая ситуация? Если не нужна, но возможна при таком раскладе, тогда, явно нужно в контейнере делать скроллер.
Если элементы находятся внутри контейнера, они уже почти наверняка однотипные в чем-то. Так что достаточно будет обработать один, и то же самое можно будет применить для всех.
Я бы пошел по пути подписывание на события изменения размера у вложенных элементов, и если размер изменился так, что нужно показать скроллер, то, естесственно показывал.
Еще, как вариант, если данные в элементы внутри контейнера попадают не из самих элементов, а из какого-то внешнего источника, который может так же сообщить и контейнеру об обновлении данных, и, соответственно, размера, то это бы вообще было идеально, т.как даже подписываться на события не нужно было бы. Контейнер сам бы установил новые свойства, и тут же сам бы проверил нужен скроллер или нет.
__________________
Hell is the possibility of sanity

Старый 20.09.2012, 13:12
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 27  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Скроллер может быть только один, поэтому конечно писать лучше во вреппере. wvxvw - про было бы идеально не понял немного о какой ситуации идет речь.

У меня приблизительно щас так :

Код AS3:
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, время: 22:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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