Нулевое приведение между родительскими и дочерними объектами - PullRequest
1 голос
/ 01 марта 2011

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

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

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

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 всегда возвращает ноль, что означает, что приведение не было успешным.Это не имеет смысла для меня, потому что bWidget имеет тип HelperWidget2.

Есть мысли?Я в тупике ...

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

Во-первых, убедитесь, что HelperWidget2 реализует IBaseWidget следующим образом:

public class HelperWidget2 implements IBaseWidget

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

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();
                }

            }
0 голосов
/ 03 октября 2012

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

var bWidget:Object = WidgetManager.getInstance().getWidget(id);
bWidget.doWhatever();
...