Actionscript 3 实现接口时未定义的属性
这是我的班级签名:Actionscript 3 实现接口时未定义的属性,actionscript-3,interface,Actionscript 3,Interface,这是我的班级签名: public class YouTubeControls extends Controls implements IControls YouTubeControls有一个公共变量foo。此代码: var controls:IControls = new YouTubeControls(); trace(controls.foo); 导致此错误的原因: 通过静态类型的引用访问可能未定义的属性fooIControls 我的应用程序将有其他“控件”类,因此强制转换控件(
public class YouTubeControls extends Controls implements IControls
YouTubeControls
有一个公共变量foo
。此代码:
var controls:IControls = new YouTubeControls();
trace(controls.foo);
导致此错误的原因:
通过静态类型的引用访问可能未定义的属性fooIControls
我的应用程序将有其他“控件”类,因此强制转换控件(YouTubeControls(controls)
)将无法工作。如何访问控件.foo
编辑如果不强制转换就无法执行此操作,那么如何处理需要知道将其强制转换为哪个类的问题?如果在
YouTubeControls
中定义了foo
,您将无法通过对IControls
的引用来访问它。如果您将代码更改为此,它将工作:
var ytControls:YouTubeControls = new YouTubeControls();
trace(ytControls.foo);
var controls:IControls = ytControls;
但是,您提到其他控件也可能具有
foo
属性;如果是这种情况,那么您应该在IControls
中定义该属性,而不是YouTubeControls
如果foo
是在YouTubeControls
中定义的,那么您将无法通过对IControls
的引用来访问它。如果您将代码更改为此,它将工作:
var ytControls:YouTubeControls = new YouTubeControls();
trace(ytControls.foo);
var controls:IControls = ytControls;
但是,您提到其他控件也可能具有
foo
属性;如果是这种情况,那么您应该在IControls
中定义该属性,而不是YouTubeControls
我目前没有访问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)
如果控件不能转换为YouTubeControl,将引发运行时异常。我目前没有访问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)
如果控件无法转换为YouTubeControl,则将引发运行时异常。如果您有多个IControls,则可能需要扩展此接口 public interface IMyControl extends IControl { public function get foo():SomeType; } 公共接口IMyControl扩展了IControl { 公共函数get foo():SomeType; } 然后 public class YouTubeControls extends Controls implements IMyControl 公共类YouTubeControl扩展控件实现IMyControl
在每个控件类中。如果有多个IControls,则可能需要扩展此接口 public interface IMyControl extends IControl { public function get foo():SomeType; } 公共接口IMyControl扩展了IControl { 公共函数get foo():SomeType; } 然后 public class YouTubeControls extends Controls implements IMyControl 公共类YouTubeControl扩展控件实现IMyControl
在每个控件类中。
跟踪(controls.foo)
与调用IControl(controls)相同。foo
,因为控件变量被声明为IControl
类型。问题是您没有为IControl
接口提供getter函数foo
。注意,接口中不允许使用属性,只允许使用方法。请参见此处的其他答案。trace(controls.foo)
与调用IControl(controls)相同。foo
,因为控件变量被声明为IControl
类型。问题是您没有为IControl
接口提供getter函数foo
。注意,接口中不允许使用属性,只允许使用方法。请参阅此处的其他答案。您的所有子类都有foo
变量吗?您的所有子类都有foo
变量吗?