Показать сообщение отдельно
Старый 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