如果我在界面前使用元数据标签,那是否与课前相同?我也可以这样做
[Event(name="fooUpdate", type="com.acme.events.FooEvent")
public interface IFoozer extends IEventDispatcher
{
}
// ... now omit that metadata in the implementations ...
public class Foozer extends EventDispatcher implements IFoozer
{
public function set bar(b:Bar):void
{
this.dispatchEvent(new FooEvent(FooEvent.FOO_UPDATE));
}
}
// ... and expect it to be known in MXML ...
<acme:Foozer fooUpdate="myUpdateHandler">
<!-- ... -->
</acme:Foozer>
或类似地,使用[Bindable]
?
答案 0 :(得分:5)
是和否......对于[Event]
是......但是[Bindable]
不仅仅是元数据标签... [Bindable]
(没有参数!!)指示编译器生成AS3代码,如果你设置属性,将确保调度PropertyChangeEvent
(你可以看到,如果你让mxmlc保持生成AS3代码)...
另外,对于[Embed]
,情况并非如此([Embed]
后面必须跟一个变量。接口不能有变量)...你总能通过{{1}检索元数据这是非常不一致的,因为一些元数据标签实际上只提供编译到输出中的元数据,而一些元数据指示编译器真正采取行动......同样,某些标签提供的元数据被如此大量使用flex框架,它们成为MXML中的一种语言功能(如flash.utils::describeType
)......但它们不在AS3中......但AS3对VM上发生的事情非常接近,而MXML和Flex Framework都是只是模糊地与它相关...这也是ActionScript类和MXML组件非常可怕地互操作的原因(你可能已经注意到MXML没有接口,执行流程(以及时间)的概念,而AS3没有事件或绑定的概念(在MXML中是“本机”,但是建立在AS3之上,使用一些元数据,以及e [Event]
包,在MXML中看起来非常好,但在AS3中进行了大量的调用和实例化))...
你想要什么,可能不会工作......我个人认为,接口被允许拥有元数据更多的是一个缺陷...几乎所有元数据都是在运行时使用...在运行时,每一个对象有自己的类,接口是次要的内省/反射......
回到旧学校的短语:一个接口需要行为,一个类提供实现 ... flash.events
是纯元数据......元数据是AS3世界中的实现,因为这不需要任何人做任何事情(你可能只是写[Event(name="fooUpdate", type="com.acme.events.FooEvent")]
)...这是一个放在一个类顶部的标签,当且仅当该类在某个地方有这条线时它的实现:[Bar(foo="123")]
...你想说的是,任何this.dispatchEvent(new FooEvent(FooEvent.FOO_UPDATE));
实现都将调度IFoozer
...这是编译器无法提供的保证,因为它没有检查元数据与实现......
希望有所帮助......
答案 1 :(得分:1)
您可以在接口中定义[Event]
元数据以供参考,但与功能不同,您无法强制实施使用这些事件。根据我的经验,您必须在实现类中重新定义事件。