我有以下套餐:
spark
spark.engine
在spark
内,我有一个班级SeCore
;在spark.engine
内,我有SeStepper
和SeKeyboard
。
我想要实现的是SeCore
是唯一可以创建SeStepper
或SeKeyboard
实例的类。这可以通过将SeCore
移入spark.engine
包并将其他两个类internal
移动来实现,但我希望SeCore
中包含spark
如果可能的话。
我已经尝试创建自己的命名空间来处理这个问题,如下所示:
package spark.engine
{
import spark.namespaces.spark_core;
use namespace spark_core;
spark_core class SeStepper extends SeObject
{
//
}
}
然而我收到错误:
1116:用户定义的命名空间属性只能在顶部使用 类定义的级别。
我能采取其他方法来实现我的目标吗?
答案 0 :(得分: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");
}
答案 1 :(得分:0)
我不能同意答案,我的意思是将事情公之于众是招揽黑客的方式。我可以在我想要的任何上下文中运行在我的计算机上运行的任何闪存中的任何公共函数,我甚至可以覆盖它们在内存中的执行,因为它们很容易找到,而使用私有/内部函数执行类似的操作几乎是不可能的。