实现接口时未定义的属性

时间:2011-08-02 01:20:11

标签: actionscript-3 interface

这是我的班级签名:

public class YouTubeControls extends Controls implements IControls

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

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

导致此错误:

  

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

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

修改
如果我不能在没有强制转换的情况下做到这一点,我该如何处理需要知道将其转换为哪个类的问题?

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

我目前无权访问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)

如果无法将控件转换为YouTube控件,则会抛出运行时异常。

答案 2 :(得分:1)

如果您有多个IControl,可能需要扩展此界面。

    public interface IMyControl extends IControl
    {
        public function get foo():SomeType;
    }

然后

    public class YouTubeControls extends Controls implements IMyControl

在每个控件类中。

答案 3 :(得分:1)

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