переопределение функции, возвращая Vector со специализированным типом - PullRequest
1 голос
/ 18 июля 2011

Можно ли реализовать подкласс, который переопределяет функцию, которая возвращает вектор со специализированными экземплярами?

Пример:

class ClassA{
    protected _vector:Vector.<DisplayObject>;

    public function get vector():Vector.<DisplayObject>{
        return _vector;
    }
}

class ClassB extends ClassA{

    public override function get vector():Vector.<Sprite>{
          return Vector.<Sprite>(_vector);
    }
}

Когда я пытаюсь сделать это так,Я получаю ошибку "недопустимое переопределение" во время компиляции.Я думаю, это потому, что сигнатуры функций не идентичны.Но как я могу решить это иначе?

Ответы [ 4 ]

1 голос
/ 18 июля 2011

Вы также можете получить функцию get, возвращающую вектор неизвестного типа:

class ClassA
{
    protected _vector : Vector.<DisplayObject>;

    public function get vector() : Vector.<*>
    {
        return _vector;
    }
}

class ClassB extends ClassA
{
    public override function get vector() : Vector.<*>
    {
        return Vector.<Sprite>(_vector);
    }
}

Или вы можете вернуть * вместо Vector. <*> Оба должны позволить вам сделать что-то вроде

var sprites : Vector.<Sprite> = classBInstance.vector;

и позволит вам переопределить функцию get и вернуть желаемый тип.

0 голосов
/ 19 июля 2011

Это основная проблема с классом Vector в ActionScript3.Это в основном предотвращает любую форму полиморфизма.Вам нужно как-то вспомнить, какие объекты возвращает ваш класс.Самый простой способ - не переопределить функцию, а оставить все как есть и привести каждый элемент к соответствующей форме.

0 голосов
/ 18 июля 2011

Переопределение должно иметь идентичную сигнатуру функции в AS3, поэтому то, что вы предлагаете, невозможно.

Вам нужно написать отдельную функцию с другой сигнатурой, которая просто возвращает исходный вектор, но приводит к желаемому типу.

Это может или не может стоить вам усилий.

0 голосов
/ 18 июля 2011

Ваше переопределение не имеет никакого смысла для меня ...:)

Если вы хотите получить весь вектор обратно, вам нужно использовать только вектор get () из ClassA, нет необходимости переопределять его:

class ClassA{
protected _vector:Vector.<DisplayObject>;

    public function get vector():Vector.<DisplayObject>{
        return _vector;
    }
}

Если вы хотите получить конкретный спрайт из вектора (ClassB или ClassA):

public function getSprite ( id : int ) : Sprite
{           
    try
    {
        return _vector[id] as Sprite;
    }
catch ( e : Error ) {}

    return null;
}

Если вы хотите получить весь вектор с типами Sprite (ClassB илиКласс А):

public function get vectorAsSprite ():Vector.<Sprite>
{
   return Vector.<Sprite> ( _vector );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...