2011-06-16 51 views
1

我在一个类中有一个吸气剂,用于制作我的属性skin:DisplayObject只读。此类还有一个属性body:AvBody,用于定义该对象的xywidthheight等,该对象依次定位skinAS3只允许访问DisplayObject上的某些属性

我想要做的就是将性能xyskin禁止访问,除非从internal命名空间(其中AvBody也位于)内访问这可能吗?

注:我不能使皮肤任何类型的比DisplayObject其他(我甚至不能让skin扩展DisplayObject,因为它与库符号产生问题类)。

+0

如果我理解的很好,有一个对象A具有皮肤和身体属性。但身体是唯一应该修饰皮肤的。我对吗 ?那么,为什么皮肤是“A”物体的属性而不是身体的属性呢? – David 2011-06-16 08:53:46

+1

身体可能代表一个物理身体,而皮肤是视图/动画片段。因此,如果皮肤是身体的一种属性,它会产生高度的耦合。 – Shannon 2011-06-16 15:30:12

回答

2

由于您不能拥有一个皮肤类,只需将皮肤放入只有AvBody和AvChild可以访问的名称空间中。

+0

嗯,我实际上已经有一个命名空间已经为这样的情况设置.. ** facepalm **。 – Marty 2011-06-17 00:31:53

0

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

不幸的是,因为函数重载是不是在AS3可能的,像下面这样的解决方案也是不可能的,因为覆盖必须具有相同的特征:

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

    //Error: Incompatible override. 

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

override public function set x(value:Number):void 
    { 
    throw new ArgumentError("Can not set public 'x' property on Skin class. Set internal 'posX' property instead"); 
    } 

override public function set y(value:Number):void 
    { 
    throw new ArgumentError("Can not set public 'y' property on Skin class. Set internal 'posY' property instead"); 
    } 

internal function set posX(value:Number):void 
    { 
    super.x = value; 
    } 

internal function set posY(value:Number):void 
    { 
    super.y = value; 
    } 
0

不,据我所知你不能这样做。但是,如提到的TheDarkIn198,你有一个设计问题,这将是很好的看看。我建议在实际的课程中实施身体(AvBody)功能,而不是合并身体和皮肤。或者创建一个新类,称为正文或其他东西,每个具有正文的对象都将从中继承。

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

所以,在我看来,最好不要限制变量,但要有充分的文件记录。

+0

他们需要访问皮肤才能定义图形 - 即skin = new BlockMC();但是,也许我可以让皮肤全部保持私密,并且在AvChild中只有一个setGraphics()方法。 – Marty 2011-06-16 23:24:24