2012-01-20 2 views
0

У меня есть класс Goo, как это:ActionScript вопрос 3 подкласса метод наследования

public class Goo extends Node 
{ 
    public function Update(dt:Number):void 
    { 
     // function to be overriden 
     trace("updating Goo"); 
    } 
} 

и подкласс Goo называется GooX:

public class GooX extends Goo 
{ 
    override public function Update(dt:Number):void 
    { 
     trace("updating GooX"); 
    } 
} 

и другой называется GooY:

public class GooY extends Goo 
{ 
    override public function Update(dt:Number):void 
    { 
     trace("updating GooY"); 
    } 
} 

, а затем менеджер, который создает объекты Goo и обновляет их следующим образом:

public class Manager 
{ 
    private var gooArray:Vector.<Goo> = new Vector.<Goo>(); 

    public function Manager():void 
    { 
     var aGoo:Goo; 
     if (Math.random() >= 0.5) 
     { 
      aGoo = new GooX(); 
     } 
     else 
     { 
      aGoo = new GooY(); 
     } 
     gooArray.push(aGoo); 
    } 

    public function Update(dt:Number):void 
    { 
     for (var i:int = 0; i < gooArray.length; i++) 
     { 
      gooArray[i].Update(dt); 
     } 
    } 
} 

Этот код всегда показывает «обновление Goo» в журнале трассировки. Я попытался также определить, какой тип это, делая gooArray[i] is GooX или gooArray[i] is GooY, но это всегда false для обоих. Даже если я заставляю отливку с gooArray[i] as GooX, она будет всегда сказать, что объект null.

Кто-нибудь знает, как сделать то, что я пытаюсь сделать (разрешить обновление дочернего класса вместо одного из родительского класса)? Благодарю.

+0

Я просто поставил код, который вы разместили здесь почти дословно, и я не получаю тех же результатов, что и вы. Меня переопределил метод, поэтому я думаю, что у вас есть что-то еще. –

+0

Занятия отлично подходят для меня. Flash Player 11.0.1.152, скомпилированный в FlashBuilder с SDK Flex 4.1. Результат, который я получаю, это «обновление GooX». Если я подключу его в цикл ENTER_FRAME, я получаю довольно ровное разброс между GooX и GooY. – meddlingwithfire

+0

Это странно, я запускаю его с помощью Flash Builder 4.6 с помощью Flex SDK 4.1 и Flash Player 11. Это не работает. – jglievano

ответ

2

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

public function Manager():void 
{ 
    gooArray.push(new GooY()); 
    gooArray.push(new GooX()); 
} 

Эта проблема может быть нечетным ошибка в компиляторе, который вы используете. Попробуйте обновить до последнего SDK, выполните чистый проект и посмотрите, не по-прежнему ли у вас такая же проблема.

И наконец, что это за объект «Узел»? Возможно, как очень маловероятная идея, этот узел является своего рода прокси-объектом, который вызывает вызовы методов угона. Однако я сомневаюсь, что это относится к вашему проекту.

+0

Спасибо, вы правы, пример логически правильный и работает сам по себе. Кажется, я нашел проблему. Конечно, примерный код относится к более широкому проекту, и я абстрагировал соответствующую часть в случае, если я что-то упустил (я не эксперт в AS3). Проблема заключалась в том, что кто-то клонировал объект подкласса Goo и снова стал объектом Goo. Может быть, причина, почему абстрактные классы так важны? – jglievano

Смежные вопросы