Не удается присвоить flex / actionscript?

Я вижу что-то странное в моем коде ActionScript

У меня есть два класса foo и bar, bar расширяет foo. В классе модели у меня есть переменная-член foo, я назначаю объект bar переменной foo. Но после присвоения переменная foo равна нулю.

[Bindable] public var f:foo;
public function someFunc(arr:ArrayCollection):void  {  
  if(arr.length > 0) {
    var tempBar:bar = arr.getItemAt(0) as bar;
    if(tempBar != null) {
      tempBar.someProp++;
      f = tempBar;
      // f is now null
    }
  }
}

Есть идеи, что я делаю неправильно?

ИЗМЕНИТЬ Вот точный код:

  [Bindable] public var selectedCustomerJob:IDSCustomer;

  public function selectedJobByIdCallback(evt:Event):void
  {
   var temp:IDSDTOArrayCollection = evt.currentTarget as IDSDTOArrayCollection;
   if(null != temp && temp.length > 0)
   {
    selectedCustomerJob = IDSJob(temp.getItemAt(0));;
    trace("    selectedCustomerJob: " + flash.utils.getQualifiedClassName(selectedCustomerJob));
    trace("       jobToSelect type: " + flash.utils.getQualifiedClassName(temp.getItemAt(0)));
    trace("jobToSelect super class: " + flash.utils.getQualifiedSuperclassName(temp.getItemAt(0)));
   }
  }

это результат трассировки:

selectedCustomerJob: null

Тип jobToSelect: com.intuit.sb.cdm.v2 :: IDSJob

суперкласс jobToSelect: com.intuit.sb.cdm.v2 :: IDSCustomer


person Ron    schedule 21.05.2010    source источник


Ответы (1)


Приведение с использованием ключевого слова as возвращает null в случае неудачи. В этом случае первый элемент в коллекции массивов может не быть объектом типа Bar, как вы ожидали; это может быть Foo или что-то еще. Вы можете преобразовать объект подкласса в базовый класс, но не наоборот.

Используйте синтаксис скобок для приведения - он выдаст исключение, если приведение не удастся, и, таким образом, вы сможете определить тип arr.getItemAt(0).

//Change 
var tempBar:Bar = arr.getItemAt(0) as Bar;

//to 
var tempBar:Bar = Bar(arr.getItemAt(0));

чтобы убедиться, что первый элемент в коллекции массивов действительно является экземпляром Bar (а не Foo или чем-то еще).

В противном случае вы можете найти тип, используя

trace(flash.utils.getQualifiedClassName(arr.getItemAt(0)));

if(tempBar != null) {
  tempBar.someProp++;
  f = tempBar;
  // f is now null
}

Между прочим, я считаю, что опубликованный код не является точным кодом, который вы запустили, потому что для f, чтобы быть null, tempBar должно быть null, когда вы назначаете его f. В этом случае код внутри if не должен выполняться, поскольку вы проверяете null внутри if. Даже если он входит в блок if, он выдаст ошибку нулевого указателя (# 1009) в первой строке, где вы пытаетесь увеличить tempBar.someProp

person Amarghosh    schedule 21.05.2010