【问题标题】:Null cast between parent and child objects父对象和子对象之间的空转换
【发布时间】:2012-10-03 04:49:21
【问题描述】:

我有一个包含两个对象的 flex 应用程序:一个父窗口小部件(称为 IBaseWidget)和一个子窗口小部件(称为 HelperWidget2)。当用户单击帮助链接时,帮助程序小部件被加载到基本小部件列表中,然后显示给用户。

但是,当我尝试通过将集合中的基本小部件转换为子小部件类型来访问此子小部件时,子小部件返回 null 并且我无法使用该小部件。

以下sn-p正确返回新添加的widget的widget ID,并调度事件加载widget:

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 类型。

有什么想法吗?我被难住了……

【问题讨论】:

  • HelperWidget2 是否实现了 IBaseWidget?
  • @sean 当我读完哈哈时,我确实在输入那个确切的问题。 +1 伟大的思想;)
  • 感谢大家的建议,请参阅下面的评论。

标签: apache-flex casting null parent


【解决方案1】:

首先,确保 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();
                }

            }

【讨论】:

  • 好主意 - 我实施了您的第二个建议。我仍然无法声明“HelperWidget2 实现 IBaseWidget”建议,因为 HelperWidget2 是一个 MXML 模块,而不是一个动作脚本类。我查看了link 以找到一种在 MXML 组件中实现接口的方法,但我无法将“implements”属性添加到我的小部件(或任何 mx 组件)中。
【解决方案2】:

将返回的实例转换为对象,而不是 HelperWidget2。在设计时您不会对方法进行智能感知,但更重要的是,它在运行时不会为空。

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

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多