AS3仅允许访问DisplayObject上的某些属性

时间:2011-06-16 06:36:17

标签: flash actionscript-3 frameworks

我在一个类中有一个getter,用于使我的属性skin:DisplayObject 只读。此类还有一个属性body:AvBody,用于定义对象的x y width height等,然后定位{{1 }}

我想要做的是禁止访问skin上的xy,除非从skin命名空间(internal所在的位置访问)也位于)这可能吗?

注意:我无法使皮肤成为AvBody以外的任何类型(我甚至无法使DisplayObject成为扩展skin的类,因为它用库符号创建问题。)

3 个答案:

答案 0 :(得分:2)

由于您不能拥有单独的皮肤类,只需将皮肤放入只有AvBody和AvChild才能访问的命名空间中。

答案 1 :(得分:0)

我相信你在这里遇到了一个设计问题,你可能会通过一些代码重构来避免或者需要这样做。也许你可以将skinavBody合并到一个班级?你可以决定,现在让我们假设重新设计不是解决方案。

遗憾的是,由于AS3中无法进行函数重载,因此无法使用如下解决方案,因为覆盖必须具有相同的签名:

override public function set x(value:Number, caller:*):void
     {
     if     (caller is AvBody)
            super.x = value;
     }

     //Error:  Incompatible override.

您可以简单地覆盖xy设置者,如果他们被调用则显示ArgumentError,而是使用x和{{1}的自定义内部设置器属性,即使它有点贫民窟。

y

答案 2 :(得分:0)

不,据我所知你不能这样做。但正如TheDarkIn198提到的那样,你有一个很好的设计问题。我建议在实际的课堂上实现身体(AvBody)功能,而不是合并身体和皮肤。或者创建一个名为 Body 之类的新类,每个具有body的对象都将继承该类。

但是我知道你正在开发一个框架,你不需要限制它的使用,因为框架将是内部的,框架的用户不需要访问皮肤,仅用于特殊情况,因此您可以通过命名空间完全禁用它。在这里,我希望你有方法满足用户可能拥有的每一个需求,例如将一个对象添加到另一个(继承,类似于addChild)。你会惊讶地发现有些图书馆有效。例如,TweenMax会将每个内部变量设为公开,但在评论中,它们会/** @private **/

所以,在我看来,最好不要限制变量,但要记录好。