Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 实现接口时未定义的属性_Actionscript 3_Interface - Fatal编程技术网

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);
导致此错误的原因:

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

我的应用程序将有其他“控件”类,因此强制转换控件(
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
变量吗?