Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Полиморфизм как :* (http://www.flasher.ru/forum/showthread.php?t=171144)

in4core 09.11.2011 20:45

Полиморфизм как :*
 
Вот такая интересная байка :
Есть скажем 5 классов, похожих по реализации и все имеющие setter / getter ( set info / get info )
Однако установка set info(value:SomeDiffrentClass)

как создать общий интерфейс для этих 5 классов, чтобы включить в него данный сеттер / геттер , если у каждого из 5 классов свой SomeDiffrentClass ?

Котяра 09.11.2011 20:48

Если у них разные SomeDiffrentClass, какой же это интерфейс?
делай ISomeDiffrentClass
а уже в реализациях кастуй
Код AS1/AS2:

set info(value:ISomeDiffrentClass) {
_info = value as SomeDiffrentClass
}


in4core 09.11.2011 20:53

Котяра - это все понятно. Косяк в другом
SomeDiffrentClass имеет различные методы внутри от другого сомеДифрент, соотв основной класс не увидит нужных методов. Я понимаю, что это не есть тру, мне было просто интересно. в данном случае яконечно же не буду строить интерфейс, он там не к месту

Wolsh 09.11.2011 20:53

А зачем? Интерфейс-то, простите, разный. Вы не можете использовать эти 5 разных типов в одной и той же ситуации, раз они принимают данные разных типов. Вы можете создать.. интерфейс данных (что по сути нелепо). Но Вы уверены, что это вообще можно называть культурным словом "Архитектура"? Вы сейчас ищете способ заставить компилятор собрать программу, в которой в сеттеры сознательно передаются не те данные, которые им нужны. Одумайтесь! :)

in4core 09.11.2011 20:54

Wolsh не я одумался, точнее я все это понимаю и так не строю программу, это чисто ради интереса вопрос был

Psycho Tiger 09.11.2011 21:06

Инфокора дело говорит.
Мне тоже хотелось создать RenderersGroup, в котором присобачить скролл с пулом объектов. Ну, например, 20 рендереров, которые рендерят некоторый вектор Vector.<SomeModels>, а при прокрутке меняют свои модели (рендерили с 0 по 19, после с 20 по 39).
Однако, модели могут быть какие угодно, главное, чтобы когда рендереру дёргали сеттер модели - тип совпадал.
Да, мне хочется темплейтов/генериков. Очень хочется.

Котяра 09.11.2011 21:06

Цитата:

соотв основной класс не увидит нужных методов
объявляте
_info как КонкретныйКласс
Цитата:

главное, чтобы когда рендереру дёргали сеттер модели - тип совпадал
ну сделай интерфейс-маркер

expl 12.11.2011 21:26

Проблема принципиальная (нет генериков в as3) - либо приведение типов, либо копипаста кода.
Приведение типов обычно, как бы не было противно его делать - выигрывает.

В критических случаях, где типизация очень нужна, можно обернуть базовый нетипизированный класс, пример обертки для хеша:
Код AS3:

public class TypedObject
{
    private var _object:Object = {};
 
    public function get(key:String):MyType
    {
      return _object[key];
    }
 
    public function set(key:String, value:MyType):void
    {
      _object[key] = value;
    }
}

Но если такое требуется для многих классов, или надо передавать сам хеш как универсальный тип - лучше смириться с приведениями.

Ну или, если требуется универсальная обработка TypedHash - дальше изголяться (пробовал такое для итератора - оверхед жуткий - выкинул нафиг и забил - итераторы только для haXe хороши):

Код AS3:

public interface IHashable
{
    function getUniversal(key:String):Object;
    function setUniversal(key:String, value:Object):void;
}
 
public class TypedObject implements IHashable
{
    private var _object:Object = {};
 
    public function get(key:String):MyType// Этим пользуется кто знает, что им TypedObject передали
    {
      return getUniversal(key) as MyType;
    }
 
    public function set(key:String, value:MyType):void
    {
      setUniversal(key, value);
    }
 
    public function getUniversal(key:String):Object// Этим пользуется тот, кто знает только о IHashable
    {
        return _object[key];
    }
 
    public function setUniversal(key:String, value:Object):void
    {
        _object[key] = value;
    }
}



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

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