2009-07-22 48 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