5

私がやりたいのは次のようなものです。

FooClass.prototype.method = function():String
{
    return "Something";
}

var foo:FooClass = new FooClass();
foo.method();

つまり、生成されたクラスを、継承ではなくプロトタイプを介して、単一のメソッドで拡張したいと思います。

このクラスはWSDLから生成されたものであり、動的クラスではありません。生成されたコードはとにかく上書きされるため、触れたくありません。

簡単に言えば、AS3のC#3:s拡張メソッドと道徳的に同等のものが欲しいです。

編集:私はaibの答えを受け入れました。なぜなら、それは私が最もよく求めていたものに合っているからです。さらに考えてみると、それは私の問題を実際には解決しませんが、それは間違った質問をする私のせいです。:)また、良い提案のためのupmods。

4

5 に答える 5

3

はい、そのようなことは可能です。

実際、あなたの例は解決策に非常に近いです。

試す

foo["method"]();

それ以外の

foo.method();
于 2008-08-12T14:31:44.300 に答える
3

@Theo: 3.0.0.477 で、デフォルトの flex-config.xml (<strict>true</strict>) と -compiler.strict パラメータが mxmlc に渡された場合の次の動作をどのように説明しますか?

Foo.as:

package
{
    public class Foo
    {
        public var foo:String;

        public function Foo()
        {
            foo = "foo!";
        }
    }
}

footest.as:

package
{
    import flash.display.Sprite;

    public class footest extends Sprite
    {
        public function footest()
        {
            Foo.prototype.method = function():String
            {
                return "Something";
            }

            var foo:Foo = new Foo();
            trace(foo["method"]());
        }
    }
}

OPは、生成されたコードを変更する場合と同様に、継承は受け入れられないと述べていることに注意してください。(そうでない場合は、クラス定義に「動的」を追加するのがおそらく最も簡単な解決策です。)

于 2008-08-14T10:55:50.283 に答える
2

クラスのメソッド数によっては、これが機能する場合があります。

実際のクラス:

public class SampleClass
{
    public function SampleClass()
    {
    }

    public function method1():void {
        Alert.show("Hi");
    }

クイックラッパー:

var actualClass:SampleClass = new SampleClass();

var QuickWrapper:Object = {
    ref: actualClass,
    method1: function():void {
        this.ref.method1();
    },
    method2: function():void {
        Alert.show("Hello!");
    }   
};

QuickWrapper.method1();
QuickWrapper.method2();
于 2008-08-14T16:07:33.617 に答える
1

モンキーパッチは(洗練されていない)オプションです。

たとえば、Flex 3 SpriteAsset.as が [7,7,7,7] のデフォルトの境界メトリックを返すという事実が気に入らないとします (flex 2 とは異なります)。これを修正するには、次のことができます。

  1. SpriteAsset.as のコピーを作成し、プロジェクトの /mx/core/SpriteAsset.as に追加します。
  2. ローカル コピーを編集して、見つかった問題を修正します
  3. アプリを実行する

他の例と手順については、Google の「flex monkey patch 」を参照してください。

于 2008-09-17T20:09:30.463 に答える
1

@aib 残念ながら正しくありません。厳密モード (デフォルトのコンパイラ モード) を仮定すると、ActionScript 3 で非動的クラス タイプのプロトタイプを変更することはできません。非厳密モードで可能かどうかさえわかりません。

ラッピングはオプションですか?基本的に、Web サービスから取得したオブジェクトの 1 つを取得し、すべてのメソッド呼び出しをそのオブジェクトに転送するだけでなく、独自のメソッドも持つクラスを作成します。

public class FooWrapper extends Foo {

    private var wrappedFoo : Foo;

    public function FooWrapper( foo : Foo ) {
        wrappedFoo = foo;
    }

    override public function methodFromFoo( ) : void {
        wrappedFoo.methodFromFoo();
    }

    override public function anotherMethodFromFoo( ) : void {
        wrappedFoo.anotherMethodFromFoo();
    }

    public function newMethodNotOnFoo( ) : String {
        return "Hello world!"
    }

}

で作業したいがFoo、必要な追加のメソッドもある場合は、Fooインスタンスを でラップし、FooWrapper代わりにそのオブジェクトで作業します。

これは最も便利な解決策ではありません。多くの入力があり、生成されたコードが変更さFooWrapperれた場合は手動でクラスを変更する必要がありますが、生成されたコードを変更して、必要なメソッドを含めるか、クラスを動的にすることができない限り、私はしませんそれがどのようにできるかわかりません。

もう 1 つの解決策は、生成されたクラスのソースを変更するステップをビルド プロセスに追加することです。WSDL からコードを生成するステップが既にあると想定しているため、必要なメソッドを挿入するステップをその後に追加することができます。

于 2008-08-13T15:38:07.253 に答える