2011-06-16 48 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