2012-04-29 8 views
0



"Factory"デザインパターンに従ってライブラリを考えてみると、私は、インタフェースを "読み取り専用"と見なし、書き込み権を持つことができるインタフェースを区別する必要があります。だから、私は次のスキーマを開発:actionscript strange getter/setter access

public interface IReadOnly { 
    function get value(): Number; 
} 
public interface IReadWrite extends IReadOnly { 
    function set value (v:Number): void; 
} 
internal class ReadWrite implements IReadWrite { 
    public function get value(): Number { 
     return m_value; 
    } 
    public function set value (v:Number): void { 
     m_value = v; 
    } 
    protected var m_value:Number; 
} 

だから、問題がある:私はクラスのインスタンスでゲッターにアクセスすることはできません。 Flexには、次のコードのコンパイルを拒否します:

function doSomething (rw:IReadWrite): void { 
    var num:Number = rw.value; 
} 

フレックスを教えてください:「1178:静的な型IReadWriteと参照を通じてアクセスできないプロパティ値のアクセスをしようとしました。」
私がセッターを単純な関数、例えばfunction setValue (v:Number): void;と置き換えると、すべてうまく行きます。

すでにこのシナリオに誰かが遭遇しましたか?それはコンパイラのバグですか?問題を解決できるコンパイラのパラメータはどれですか?

ありがとうございました。

答えて

0

これを解決できたかどうかはわかりませんが、回避策が見つかりました。ゲッターメソッドが実際に定義されているインターフェイスに、ゲッターが呼び出されているオブジェクトをキャストする必要があります。したがって、関数呼び出しは次のようになります。

function doSomething (rw:IReadWrite): void { 
    var num:Number = IReadOnly(rw).value; 
} 

これは醜いですが、それは仕事を完了します。

+0

ありがとう!はい、私のコードは、他のdevsのlibにパックされるので、醜いと本当に "ユーザーフレンドリー"ではありません。しかし、明確なドキュメンテーションを使って、私は素敵なlibデザインを手に入れました。 (私はあなたの答えを上げたいですが、私の "評判"はまだ十分ではありません...) – Clem

1

IReadWriteインターフェイスが誤ってReadWriteクラスを拡張しています。 IReadOnlyインターフェイスを拡張する必要があります。

私は、コンパイラがクラスを拡張するインタフェースを宣言できることにも驚いています。

+1

私は驚くことではありませんが、結局はフラッシュです。 lol –

+0

申し訳ありませんが、私は "IReadWrite"インタフェース宣言の "ReadOnly"の前に "I"を忘れてしまいました。だから、私のIReadWriteインターフェイスは本当にIReadOnlyインターフェイスを拡張します。私はこの間違いを訂正するために私の投稿を編集する。 – Clem