【问题标题】:Undefined properties when implementing interface实现接口时未定义的属性
【发布时间】:2011-08-02 01:20:10
【问题描述】:

这是我的班级签名:

public class YouTubeControls extends Controls implements IControls

YouTubeControls 有一个公共变量 foo。这段代码:

 var controls:IControls = new YouTubeControls();  
 trace(controls.foo);

导致此错误:

通过静态类型 IControls 的引用访问可能未定义的属性 foo。

我的应用程序将有其他“控制”类,因此转换控件 (YouTubeControls(controls)) 将不起作用。如何访问controls.foo

编辑
如果没有强制转换就无法做到这一点,我该如何处理需要知道将其强制转换为哪个类的问题?

【问题讨论】:

  • 你所有的子类都有foo变量吗?

标签: actionscript-3 interface


【解决方案1】:

trace(controls.foo); 与调用IControl(controls).foo 相同,因为您的控制变量被声明为IControl 类型。问题是你没有给IControl接口一个getter函数foo。注意,接口中不允许有属性,只有方法。在此处查看其他答案。

【讨论】:

    【解决方案2】:

    如果在YouTubeControls 中定义了foo,您将无法通过对IControls 的引用来访问它。如果您将代码更改为此,它将起作用:

    var ytControls:YouTubeControls = new YouTubeControls();
    trace(ytControls.foo);
    var controls:IControls = ytControls;
    

    但是,您提到其他控件也可能具有foo 属性;如果是这种情况,那么您应该在 IControls 中定义该属性,而不是 YouTubeControls

    【讨论】:

      【解决方案3】:

      我目前无法访问 Flash Builder,但我相信您应该能够使用“as”运算符来测试对象是一类还是另一类。

      if ((controls as YouTubeControls) != null) //controls IS a YouTubeControls 
                                                 //because it didn't return null
          trace((controls as YouTubeControls).foo);
      else
          ...
      

      'as' 运算符的优点是它会尝试强制转换,但如果失败则返回 null,而另一种强制转换形式...

      YouTubeControls(controls)
      

      如果控件无法转换为 YouTubeControls,将引发运行时异常。

      【讨论】:

        【解决方案4】:

        如果您有多个 IControl,您可能希望扩展此接口。

        公共接口 IMyControl 扩展了 IControl { 公共函数获取 foo():SomeType; }

        然后

        公共类 YouTubeControls 扩展 Controls 实现 IMyControl

        在您的每个控件类中。

        【讨论】:

          猜你喜欢
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-26
          • 2020-09-19
          相关资源
          最近更新 更多