Flex / AS3元数据标签在接口定义中的处理方式是否与类定义不同?

时间:2009-10-29 21:53:12

标签: flex actionscript-3

如果我在界面前使用元数据标签,那是否与课前相同?我也可以这样做

[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]

2 个答案:

答案 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]元数据以供参考,但与功能不同,您无法强制实施使用这些事件。根据我的经验,您必须在实现类中重新定义事件。