1

我在 mxml 中定义的组件的脚本块中定义了一个受保护的函数,如下所示:

<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="onCreationComplete()">
    <fx:Script>
    <![CDATA[
    protected function onCreationComplete():void {

    }
    ...

是否可以像这样覆盖组件实例中的函数:

<gen:CreateObjectFormSubmit id="formSubmit">
     <fx:Script>
     <![CDATA[
          override protected function onCreationComplete():void {
              form=form1;
          }
     ]]>
     </fx:Script>
4

3 回答 3

4

你当然可以。MXML组件是一个类,所以如果你基于组件A创建组件B(B继承自A),那么你可以在B中覆盖A的方法。

于 2012-04-04T07:20:17.150 回答
1

要覆盖任何函数,你想要覆盖的函数应该在你当前类的父类中可用。

public class A {
  public function methodtooverride():void{
    trace('in class A');
  }
}

public class B extends A {
  override public function methodtooverride():void{
    trace('in class B');
  }
}
于 2012-04-04T07:45:46.987 回答
1

请注意您在何处以及如何声明您的超级类。从上面提供的语法来看,您可能正在尝试在 mxml 类中声明一个 <component> 标记,如果是这种情况 - 编译器会将其视为单独的子对象,而不是实际的扩展。

一方面,根级标签不能声明 id(但组件可以 - 这将成为类名),并且您很可能需要显式声明所有 xml 命名空间。

为了使其成为真正的扩展,您的第一个 <VGroup> 类需要命名为 CreateObjectFormSubmit,这将成为您扩展类的根标记。但是有一个问题,如果你从一个 mxml 类扩展,你就不能声明任何额外的子类(由于布局规则,在 mxml 表示法中)。

如果正如您所说的您的类的实例,那么您将无法覆盖它,因为 <Script> 标记的函数范围仍将驻留在根级别内。在声明 <component> 标记时,这有时也称为“外部文档”。

在常规 AS 中执行上述操作并没有什么不同,如下所示:

class SomethingCool extends UIComponent {
    ...
    public function addButtons():void
    {
         var btn:Button = new Button();
             btn.id = 'formSubmit';
             //can't declare an override of Button here
    }
}
于 2012-04-04T18:17:07.603 回答