2011-09-05 61 views
3

我有以下软件包:AS3内部和自定义命名空间

spark
        spark.engine

spark我有一个类SeCore;并在spark.engine内我有SeStepperSeKeyboard

我试图实现的是SeCore是唯一可以创建SeStepperSeKeyboard的实例的类。这可以通过将SeCore转换为spark.engine包并将其他两个类internal来实现,但如果可能的话,我希望在spark包中有SeCore

我试着让我自己的命名空间来处理这个问题,像这样:

package spark.engine 
{ 
    import spark.namespaces.spark_core; 

    use namespace spark_core; 

    spark_core class SeStepper extends SeObject 
    { 
     // 
    } 
} 

但是我得到的错误:

1116: A user-defined namespace attribute can only be used at the top level of a class definition.

有没有我可以达到什么样的任何其他方法我在之后?

+0

在运行时检查确定,还是你想在编译时? – RIAstar

+0

RIAstar,编译时更可取,但运行时正常,因为我可以抛出一个错误。 @Jevgenij Dmitrijev你的评论与任何事情有什么关系? – Marty

回答

1

99%的时间,标记为'内部'是一个坏主意。最好为“禁区”类和成员制定命名规则,并允许开发人员自行承担风险。将事物标记为“内部”或“私人”是应该很少进行的事情,并且要有深思熟虑。

但是,您可以在运行时通过在SeCore中使用只读属性并从SeStepper和SeKeyboard中检查其值来强制实施此行为。

以下是伪码,一会儿没有用过AS3。

在SeCore

private var _createAuthorized = false; 
public function get CreateAuthorized():boolean {return _createAuthorized;} 

private function createSeStepper(){ 
    _createAuthorized = true; 
    var obj = new SeStepper(this) 
    _createAuthorized = false; 
    return obj; 
} 

在SeStepper

public function SeStepper(core:SeCore){ 
    if (!core.CreateAuthorized) throw new Error("Only SeCore can do this"); 
} 
+0

重申您的第一个注意事项:基本上,我正在创建一个引擎,您可以在其中创建SeCore实例(在构造函数中创建其他类的实例,例如步进器和键盘)。通过core.keyboard等获得这些类的访问权限,但我不希望人们自己创建它们的实例。希望清除任何建议,我的编码风格是奇怪的/有问题的。当然,我可以简单地使用命名约定,但我试图尽可能锁定不应该访问的内容,以避免混淆。 – Marty

0

我不能回答同意,我的意思是让事情公开是方式邀请黑客。我可以在我想要的任何环境中执行任何我的计算机上运行的任何公共函数,我甚至可以在内存中覆盖它们的执行,因为它们很容易找到,而像私人/内部函数那样做几乎是不可能的。

+0

我愿意接受优秀的答案,因为您的意见也是我的想法。 – Marty