2008-08-10 49 views
5

我想要做的是類似如下:是否可以在不繼承類的情況下將行爲添加到非動態ActionScript 3類?

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

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

這就是說,我想擴展生成的類與單一的方法,而不是通過繼承,但通過原型。

從WSDL生成的類別,它不是一個動態類的,我不想碰生成的代碼,因爲它總要被改寫。

長話短說,我想有C#3道德等價的:擴建方法AS3。

編輯:我接受了AIB的答案,因爲它符合我問最好的 - 儘管在進一步思考它並沒有真正解決我的問題,但是這是我的問錯了問題故障。 :)另外,upmods的好建議。

+0

@aib是對的,我在測試時犯了一個錯誤。我忘了原型只能在類上訪問,而不能在每個對象上訪問,所以對我來說,我得到了運行時錯誤。但是,我的包裝解決方案不是子類,它是包裝。包裝類只擴展原始的,以便它具有相同的類型。 – Theo 2008-08-14 20:39:16

回答

3

是的,這樣的事情是可能的。

事實上,您的示例非常接近解決方案。

嘗試的

foo["method"](); 

代替

foo.method(); 
1

@aib遺憾的是不正確。假設使用嚴格模式(默認編譯器模式),則無法在ActionScript 3中修改非動態類類型的原型。我甚至不確定在非嚴格模式下是可能的。

包裝選項?基本上你創建一個類,將您從Web服務獲得,只是轉發所有方法調用的對象之一,但也有其自己的方法:

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類,但除非您可以修改生成的代碼,以包含您想要或想要的方法班級動態我看不出如何做到這一點。

另一種解決方案是在構建過程中添加一個步驟,以修改生成的類的來源。我假設你已經有了一個從WSDL生成代碼的步驟,所以你可以做的是在插入你需要的方法之後添加一個步驟。

4

@Theo:你如何解釋3.0.0.477以下工作與默認的Flex-config.xml中(<嚴格>真正< /嚴格>),甚至傳遞到MXMLC一個-compiler.strict參數?

Foo.as:

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

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

footest。如:

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表示繼承是不可接受的,正如修改生成的代碼。 (如果不將「動態」類定義的情況下,很可能是最簡單的解決方案)

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(); 
1

猴修補是一個(不雅)選項。

例如,假設您不喜歡Flex 3 SpriteAsset.as返回默認邊界度量值[7,7,7,7](與flex 2不同)的事實。爲了解決這個問題,您可以:

  1. 創建SpriteAsset.as的副本,並將其在/mx/core/SpriteAsset.as添加到您的項目
  2. 編輯您的本地副本來解決任何問題,你會發現
  3. 運行你的ap

谷歌「flex monkey patch」的更多的例子和說明。

相關問題