2012-04-04 15 views
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> 
+0

上記は、何が違うのは、以下の好きなように定期的にそれをやってないだろう!何が問題ですか ? –

答えて

1

スーパークラスを宣言する場所と方法には注意してください。上記の構文から、<コンポーネント>タグをmxmlクラスに宣言しようとしているように見えます。この場合、コンパイラはこれを実際の拡張ではなく別の子オブジェクトとして扱います。

ルートレベルのタグではidを宣言することはできませんが、コンポーネントはクラス名になります。ほとんどの場合、すべてのxml名前空間を明示的に宣言する必要があります。

真の拡張であるためには、最初の<VGroup>クラスの名前をCreateObjectFormSubmitにする必要があります。これは、拡張クラスのルートタグになります。ただし、mxmlクラスから拡張する場合、追加の子を宣言することはできません(レイアウトルールのためにmxml表記で)。

あなたのクラスのインスタンスを言うようにした場合<スクリプトの機能の範囲は>タグがまだルートレベル内に存在するであろうから、その後、何あなたは、それを上書きすることはできませんでしょう。 <コンポーネント>タグを宣言するとき、これは「outerDocument」と呼ばれることもあります。あなたのサンプルが完璧に動作するはずです

class SomethingCool extends UIComponent { 
    ... 
    public function addButtons():void 
    { 
     var btn:Button = new Button(); 
      btn.id = 'formSubmit'; 
      //can't declare an override of Button here 
    } 
} 
+0

これは私がこの質問で意味したことですが、私はFlexで匿名のクラス拡張があると思ったのはなぜですか? – MetaChrome

4

もちろん、できます。 MXMLコンポーネントはクラスなので、コンポーネントA(BがAから継承)に基づいてコンポーネントBを作成すると、BのAのメソッドをオーバーライドすることができます。

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'); 
    } 
} 
関連する問題