0



「ファクトリー」設計パターンに従ってライブラリを考えると、「読み取り専用」と見なすインターフェースと、書き込み権限も持つことができるインターフェースを区別する必要があります。そこで、次のスキーマを開発します。

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;
}

Flex からの連絡: 「1178: 静的型 IReadWrite を使用した参照を通じて、アクセスできないプロパティ値にアクセスしようとしました。」
セッターを単純な関数に置き換えると、function setValue (v:Number): void;すべてがうまくいきます。

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

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

4

2 に答える 2

1

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

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

于 2012-04-29T04:04:57.407 に答える
0

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

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

見た目は悪いですが、仕事はできます。

于 2013-04-23T18:33:02.550 に答える