2011-06-16 12 views
1

私のプロパティを作るために使用されるクラス内にゲッターを持っていますskin:DisplayObject読み取り専用。このクラスには、オブジェクトのxywidthheightなどを定義するために使用されるプロパティbody:AvBodyがあり、次にskinが配置されます。AS3 DisplayObjectの特定のプロパティへのアクセスのみを許可します

AvBodyも配置されている)internal名前空間内からアクセスしない限り、私は何をしたいことはプロパティxskinyへのアクセス不能であるが、このことは可能ですか?

注:私は皮膚DisplayObject以外の任意のタイプ(私もskinそれはライブラリシンボルで問題を作成するためDisplayObjectを拡張するクラスを作ることができない)ことはありませことができます。

+0

私がよく理解していれば、皮膚と身体の両方の性質を持つオブジェクトAがあります。しかし、体だけが肌を修正すべきものです。私は正しい?それで、なぜ肌は "A"オブジェクトのプロパティであり、ボディのプロパティではありませんか? – David

+1

ボディはおそらくフィジックスボディを表し、スキンはビュー/ムービークリップです。したがって、皮膚が身体の特性である場合、それは高い結合を生じさせるだろう。 – Shannon

答えて

2

個々のスキンクラスを持つことはできないので、AvBodyとAvChildだけがアクセスできる名前空間にスキンを入れるだけです。

+0

私は実際にこのような状況のために既に設定された名前空間を持っています。** facepalm **。 – Marty

0

私はここで設計上の問題にぶつかっていると思うので、コードの再構築をしたいと思うことを避けることができます。おそらく、skinavBodyを1つのクラスに結合できますか?あなたは決定することができ、今は再設計が解決策ではないと仮定しよう。 ArgumentErrorを表示し、

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

    //Error: Incompatible override. 

あなたは、単にxyセッターをオーバーライドすることができます:関数のオーバーロードは、AS3では不可能であるため、オーバーライドは、同一の署名を持っている必要がありますので、

残念ながら、次のような解決策も可能ではありませんそれらが呼び出された場合は、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

関連する問題