Сбой назначения flex / actionscript? - PullRequest
1 голос
/ 21 мая 2010

Я вижу что-то странное в коде 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
    }
  }
}

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

EDIT Вот точный код:

  [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

1 Ответ

0 голосов
/ 21 мая 2010

Приведение с использованием ключевого слова 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...