Приведение к нулю между родительским и дочерним объектами

У меня есть гибкое приложение с двумя объектами: родительский виджет (называемый IBaseWidget) и дочерний виджет (называемый HelperWidget2). Когда пользователь щелкает ссылку справки, вспомогательный виджет загружается в список базовых виджетов и затем отображается для пользователя.

Однако, когда я пытаюсь получить доступ к этому дочернему виджету, преобразовывая базовый виджет в коллекции к типу дочернего виджета, дочерний виджет возвращает значение null, и я не могу работать с виджетом.

Следующий фрагмент кода правильно возвращает идентификатор вновь добавленного виджета и отправляет событие для загрузки виджета:

var id:Number = WidgetManager.getInstance().getWidgetId("Helper");
ViewerContainer.dispatchEvent(new AppEvent(AppEvent.WIDGET_RUN, id, openQuickQueryCanvas));

После загрузки виджета функция обратного вызова openQuickQueryCanvas () пытается выполнить другое действие с вспомогательным виджетом:

private function openQuickQueryCanvas():void{
            var id:Number = WidgetManager.getInstance().getWidgetId("Helper");
            var bWidget:IBaseWidget = WidgetManager.getInstance().getWidget(id) as IBaseWidget;
            var helperWidget:HelperWidget2 = bWidget as HelperWidget2;
            if(helperWidget != null){
                helperWidget.quickQueryCanvas.dispatchEvent(new MouseEvent(MouseEvent.CLICK));//fire an event to open the quick query canvas
            }

        }

Проблема в том, что приведенный выше helperWidget всегда возвращает null, что означает, что приведение не было успешным. Для меня это не имеет смысла, потому что bWidget имеет тип HelperWidget2.

Есть предположения? Я в тупике ...


person Kyle    schedule 01.03.2011    source источник
comment
Реализует ли HelperWidget2 IBaseWidget?   -  person sean    schedule 02.03.2011
comment
@sean Я буквально набирал этот вопрос, когда закончил читать, ха-ха. +1 за великие умы;)   -  person Jonathan Dumaine    schedule 02.03.2011
comment
Спасибо за предложения, ребята, см. мой комментарий ниже.   -  person Kyle    schedule 03.03.2011


Ответы (2)


Прежде всего, убедитесь, что HelperWidget2 реализует IBaseWidget следующим образом

public class HelperWidget2 implements IBaseWidget

Во-вторых, я бы предложил использовать ключевое слово is вместо преобразования и проверки на null:

private function openQuickQueryCanvas():void {
                var id:Number = WidgetManager.getInstance().getWidgetId("Helper");
                var bWidget:IBaseWidget = WidgetManager.getInstance().getWidget(id) as IBaseWidget;

                if(bWidget is HelperWidget2)
                {
                  HelperWidget2(bWidget).doWhatever();
                }

            }
person Jonathan Dumaine    schedule 01.03.2011
comment
Хорошие мысли - я реализовал ваше второе предложение. У меня все еще возникают проблемы с объявлением, что HelperWidget2 реализует предложение IBaseWidget, поскольку HelperWidget2 - это модуль MXML, а не класс ActionScript. Я просмотрел ссылку, чтобы найти способ реализовать интерфейс в компоненте MXML, но я не могу добавить атрибут реализации к моему виджету (или любому компоненту mx). - person Kyle; 03.03.2011

Приведите возвращаемый экземпляр как объект вместо HelperWidget2. У вас не будет intellisense для методов во время разработки, но, что более важно, он не будет иметь значение NULL во время выполнения.

var bWidget:Object = WidgetManager.getInstance().getWidget(id);
bWidget.doWhatever();
person rboone    schedule 02.10.2012