这是我的班级签名:
public class YouTubeControls extends Controls implements IControls
YouTubeControls
有一个公共变量foo
。这段代码:
var controls:IControls = new YouTubeControls();
trace(controls.foo);
导致此错误:
通过静态类型
IControls
的引用访问可能未定义的属性foo。
我的应用程序将有其他“控件”类,因此转换控件(YouTubeControls(controls)
)将不起作用。我如何访问controls.foo
?
修改的
如果我不能在没有强制转换的情况下做到这一点,我该如何处理需要知道将其转换为哪个类的问题?
答案 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
。注意,接口中不允许使用属性,只允许使用方法。在这里查看其他答案。