我在一个类中有一个getter,用于使我的属性skin:DisplayObject
只读。此类还有一个属性body:AvBody
,用于定义对象的x
y
width
height
等,然后定位{{1 }}
我想要做的是禁止访问skin
上的x
和y
,除非从skin
命名空间(internal
所在的位置访问)也位于)这可能吗?
注意:我无法使皮肤成为AvBody
以外的任何类型(我甚至无法使DisplayObject
成为扩展skin
的类,因为它用库符号创建问题。)
答案 0 :(得分:2)
由于您不能拥有单独的皮肤类,只需将皮肤放入只有AvBody和AvChild才能访问的命名空间中。
答案 1 :(得分:0)
我相信你在这里遇到了一个设计问题,你可能会通过一些代码重构来避免或者需要这样做。也许你可以将skin
和avBody
合并到一个班级?你可以决定,现在让我们假设重新设计不是解决方案。
遗憾的是,由于AS3中无法进行函数重载,因此无法使用如下解决方案,因为覆盖必须具有相同的签名:
override public function set x(value:Number, caller:*):void
{
if (caller is AvBody)
super.x = value;
}
//Error: Incompatible override.
您可以简单地覆盖x
和y
设置者,如果他们被调用则显示ArgumentError
,而是使用x
和{{1}的自定义内部设置器属性,即使它有点贫民窟。
y
答案 2 :(得分:0)
不,据我所知你不能这样做。但正如TheDarkIn198提到的那样,你有一个很好的设计问题。我建议在实际的课堂上实现身体(AvBody)功能,而不是合并身体和皮肤。或者创建一个名为 Body 之类的新类,每个具有body的对象都将继承该类。
但是我知道你正在开发一个框架,你不需要限制它的使用,因为框架将是内部的,框架的用户不需要访问皮肤,仅用于特殊情况,因此您可以通过命名空间完全禁用它。在这里,我希望你有方法满足用户可能拥有的每一个需求,例如将一个对象添加到另一个(继承,类似于addChild)。你会惊讶地发现有些图书馆有效。例如,TweenMax会将每个内部变量设为公开,但在评论中,它们会/** @private **/
。
所以,在我看来,最好不要限制变量,但要记录好。