Приведение в качестве подкласса в ActionScript

У меня есть следующие классы в ActionScript:

public class A {
}

public class B extends A {
}

и эти переменные (в другом классе):

public var InstanceOfA:A;
public var InstanceOfB:B;

Как преобразовать экземпляр A в класс B?

Я пытался:

InstanceOfA = new A();
InstanceOfB = InstanceOfA as B; 
trace(InstanceOfB);

Я получаю объект типа A для InstanceOfB.

Я также пробовал:

instanceOfB = B(InstanceOfA);

В этом случае я получаю сообщение об ошибке «Ошибка приведения типа».


person sutee    schedule 01.07.2009    source источник


Ответы (2)


При кастинге вы можете приводить только от более конкретного к менее конкретному. Поскольку B расширяет A, теоретически он должен содержать более специфический код, чем класс A. Из-за этого можно представить B как A (поскольку B — это A), но вы не можете представить A как B, потому что A не является B.

Чтобы выразить это, вероятно, более логично, скажем, класс A — это «Животное», а класс B — «Собака». Dog — это более конкретная реализация Animal.

Собака — это животное, поэтому вы можете разыграть собаку как животное, но вы не можете взять животное и разыграть его как собаку, потому что не каждое животное — собака.

Надеюсь, это имеет смысл.

Теперь, если вы хотите сделать что-то вроде того, что вы сделали выше, вы можете либо A, либо B расширить абстрактный базовый класс, либо реализовать интерфейс и ввести обе ваши переменные экземпляра либо как абстрактный класс, либо как интерфейс.

person Alex Jillard    schedule 01.07.2009

Дополнение к ответу Алекса Джилларда: можно преобразовать переменную типа A в тип B, если значение в instanceofA уже имеет тип B.

Итак, если у вас есть

var instanceOfA:A = new B();

тогда это будет работать:

instanceOfB = instanceOfA as B;

Это происходит при обработке событий. Свойство currentTarget в MouseEvent объявлено как тип Object, но во время выполнения это, скорее всего, будет Sprite или MovieClip.

person Selene    schedule 15.07.2009