2009-07-22 53 views
1

在ActionScript中,所有構造函數都必須是公共的。然而,有時候,允許用戶創建一個類的新實例是不可行的(因爲類可能與物理系統資源,網絡套接字等有關)。在ActionScript中模擬內部ctor?

Anyony知道是否有辦法讓ActionScript在ActionScript中不可創建嗎?在本質上,我的目標是:

public class SomeClass 
{ 
    internal function SomeClass():void { } 
    . . . 
} 

我想我可以解決這個問題通過定義一個接口和一個內部類實現它,但只是感覺不對我說:

internal class ClassImpl implements ISomeClass 
{ 
    . . . 
} 

建議?

回答

1

是的,安全的說法招... :)

這是一個良好的開端,但有一個簡單的數字,它只會拋出運行時錯誤,如果你的號碼傳遞(加有1機會/ 2^64你猜的是正確的數字......:D)......使用這個,如果你想編譯時也有錯誤(一個愚蠢的事情是,你不能設置一個類型爲非-nullable,所以空將永遠是一個有效的論據):

package { 
    public class Test { 
     public function Test(enforcer:TestEnforcer) { 
      if (enforcer == null) throw "haha, good try ... but, no! :P"; 
     } 
     public static function create():Test { 
      //do your cheks here 
      return new Test(TestEnforcer.enf); 
     } 
    } 
} 
class TestEnforcer { 
    public function TestEnforcer() { } 
    public static const enf:TestEnforcer = new TestEnforcer(); 
} 

另一種方法是,建立公共接口MyPrivateConstrClass和私人/內部類MyPrivateConstrClassImpl,並有另一種樂趣ction那將實例MyPrivateConstrClassImpl,但讓該函數的返回值是MyPrivateConstrClass類型的...這是一個有點矯枉過正,但100%的編譯和運行時的安全...

格爾茨

back2dos

+1

您可以通過簡單地使用Object類型的私有靜態字段並對其執行嚴格等於(===)檢查來簡化此實現。 – 2009-10-04 08:05:13

1

這裏有一個解決方案,其中a magic number is needed爲構造函數的工作。希望這可以有所幫助。

+0

該鏈接似乎下降atm。我自己也想到了這一點,但並不想讓'魔術'參數混亂。謝謝 – cmroanirgo 2009-07-23 00:56:01