2012-02-07 17 views
2

私はdynamic Classを持っていますが、実行時にプロパティがクラスに追加されるたびにメソッドを呼び出しています。例えばAS2:新しいプロパティが設定されたときの呼び出しメソッド

dynamic class Example 
{ 

    public function Example() 
    { 
     trace("New instance created"); 
    } 

    public function setter(name:String, value:String):Void 
    { 
     trace("Property '"+name+"' created with value '"+value+"'"); 
    } 
} 

そして、私が例に新しいプロパティを追加するタイムラインから:

Example.newProperty = "some value"; 

私はそれをトレースする:

プロパティ ' newProperty 'は値' some value 'で作成されました

私はこれがそうのようにプロパティを設定する機能を使用することにより可能であることを十分に承知しています:

public function setter(name:String, value:String):Void 
{ 
    this[name] = "some value"; 
    trace("Property '"+name+"' created with value '"+value+"'"); 
} 

などのようにそれを呼び出す:私はこの方法がときに自動的に起動するようにしたいしかし

Example.setter("newProperty", "some value"); 

プロパティは通常の.dot演算子を介して追加され、関数を明示的に呼び出す必要はありません。

これは可能ですか?

答えて

0

これはAS2なので、はい、あなたのクラスは__resolve(x)メソッドを実装する必要があります。しかし、私はそれが非常に疑わしい設計上の決定だと考えています。キーと値を受け入れる関数は私にははるかに良く見えますが、結局コードは少なくなります。

+0

おそらく疑問がありますが、私は可能な限り簡単に他の人が使用できるようにクラスを構築しています。私は '__resolve'は誰かが割り当てられていないときに関数を呼び出さないようにオブジェクトの未割り当てのプロパティを読み込もうとすると思ったのですか? –

+0

私はプロパティとして関数を格納しようとしていないので、後でそのプロパティを呼び出すことはありません。私が望むのは、以前に定義されていないプロパティが設定されている場合に、インスタンスが(クラスですでに定義されている)メソッドを実行することです。この場合はドロップダウンクラス用で、誰かが 'dropdown.newOption =" blah blah "'と言って新しいドロップダウンオプションを任意の時点でリストに追加できるようにすると、新しいオプションを描画して割り当てるメソッドが実行されますドロップダウンに。 –

+0

未定義のパラメータを使用しようとしない限り、 '__resolve(x)'は呼び出されません。 'example.something'が設定されていないときは、' trace(example.something);です。 'example.something =" value "'を試みると呼び出されません。また、この方法は、私が使用するために設計している人にとっては100%簡単です。彼らはプログラマーではなく、構造やコードの真意を気にしません。構文の理解とコーディングがはるかに簡単です。 –

0

ここでProxyを使用できます。

例クラス:

package 
{ 
    import flash.utils.Proxy; 
    import flash.utils.flash_proxy; 

    dynamic public class Example extends Proxy 
    { 

     private var _properties:Object = {}; 


     override flash_proxy function setProperty(name:*, value:*):void 
     { 
      _properties[name] = value; 
      trace("Property '" + name + "' created with value '" + value + "'"); 
     } 


     override flash_proxy function getProperty(name:*):* 
     { 
      return _properties[name]; 
     } 

    } 
} 

デモコード:

var ex:Example = new Example(); 

ex.something = 10; 
ex.more = "something more"; 

trace(ex.something); 
trace(ex.more); 

出力:値を使用して作成

プロパティ '何か' '10'
プロパティ 'より' で作成されました値 '何かもっと'
何かもっと

+0

プロキシクラスをインポートできません。リンク先の言語リファレンスがAS3のものであることがわかりました。これはAS3でのみ利用できますか? –

関連する問題