2011-07-26 12 views
1

私はAS3で少し戦ってきましたが、私はactionscriptとFlashDevelop/flex-compilerコンボだけを使った簡単なアプリケーションを開発しています。私は私の虚構のOOPの理解の壁を少し打ってきました。誰かが私を正しい方向に向けることができるかどうかは疑問です。私は本当にいくつかの本を読んで、オンラインチュートリアルなどを読むのに多くの時間を費やしましたが、何かをクリックしていないだけです!actionscriptのスコープとプロパティのリファレンスについての特定の質問3

これは私が読んでいるところによれば、何かが「公開」と宣言されたとき、それはアプリケーションのどこでも利用可能です(したがって、注意して使用する必要があります)。しかし、プロパティとメソッドは、私のプログラムでは、それらをインスタンス化したクラス/オブジェクト以外の場所では利用できません。

これは、たとえ(異なるクラスの)オブジェクトが同じ(「メイン」)クラスからインスタンス化されても、パブリックメンバーを介しても互いに通信することができないと結論づけます。

もしそうならば、十分に公平ですが、私は正直なところ、これはどこでも正しく説明されていません。もっと重要な点は、異なるオブジェクトが他のオブジェクトとどうやって通信するかです。それが直接的な構成階層を介してのみ機能するのであれば、Publicは実際に何を意味していますか?コンポーザークラスからそれ自身のオブジェクトへの通信だけに基づいてアプリケーションを作成しなければならない場合(おそらく、他のすべてのイベントを使用しますか?)、これは信じられないほど制限的ではありませんか?

私はこれが基本的なOOPのものだと確信していますので、事前に申し訳ありません!

クイックヒントやリンクは非常に高く評価されます。

答えて

0

質問にはさまざまなトピックがあります。

  • 改変者は何を意味していますか?
  • 同じクラスのインスタンス同士は、どのように通信できますか?

-

1.

はOOPでは、オブジェクトを使用してコードを整理します。その機能を提供するには、オブジェクトをインスタンス化する必要があります。オブジェクトをインスタンス化する場所は、「コンテキスト」とみなすことができます。 Flashでは、コンテキストは最初のフレームで、純粋なAS3ムービーではメインクラス、Flexではメインのmxmlファイルになる可能性があります。実際、コンテキストは常にオブジェクトでもあります。オブジェクトのクラス修飾子public class MyClassは、オブジェクトのインスタンス化が許可されているかどうかをコンテキストに通知します。 internalに設定すると、コンテキストはオブジェクトのクラスと同じディレクトリに存在する必要があります。それ以外の場合、クラスの新しいオブジェクトを作成することはできません。 Privateまたはprotectedは有効なクラス修飾子ではありません。 Public class ...は、どんなコンテキストでもそのクラスのオブジェクトを作成できることを意味します。次へ:インスタンス化はこれらの修飾子によって制御されるだけでなく、タイプの可視性も制御されます。 internalに設定した場合、var obj : InternalTypeのような式を内部型と同じディレクトリに存在しないコンテキストで使用することはできません。

方法とプロパティはどうですか?コンテキストが型にアクセスすることが許可されていても、特定のプロパティとメソッドが制限されている可能性があります。internal/protected/private var/methodを呼び出すことはできません。

なぜこのような制限がありますか?回答は単純です:異なる開発者が同じソフトウェアの異なる部分を開発するかもしれません。これらの部分は、定義されたインターフェイス上でのみ通信する必要があります。これらのインターフェイスはできるだけ小さくする必要があります。したがって、開発者はできるだけ多くのコードを外部から隠すように宣言し、公開されている必要な型とプロパティのみを宣言します。

  1. 修飾子とグローバルプロパティを混同しないでください。修飾子は、コンテキストが型またはメソッドを参照できるかどうかだけを通知します。グローバル変数はコード全体で使用できます。だからクラスがパブリックであると宣言されたとしても、そのクラスのインスタンスはデフォルトでは互いに知りません。

    • 各オブジェクトはメソッドの引数としてオブジェクトを渡す
    • 変数インスタンス内の参照を格納する必要がset obj1(obj1 : OBJ1) : voidようなセッターを提供するグローバル変数にインスタンスを保存する:あなたは、によってそれらを知らせることができdoSomething(obj1 : OBJ1)

が、これは、あなたがより多くのOOPを理解するのに役立ちます願っています。あなたのフォローアップの質問には満足しています。

イェンス

0

@Jens答え(免責事項:私は脱脂は)完全に正しいように見えます。

しかし、私はあなたの質問に非常に直接答えるかどうか分からないので、ここで少し追加します。

パブリックプロパティは、他のオブジェクトが(:呼び出し、変数:アクセスなどの機能)を使用することが可能であることクラスインスタンスの特性です。しかし、それらを使用するには、参照(非常に基本的なポインタのように、それが役に立ちますか?)をそのオブジェクトインスタンスに持たなければなりません。そのオブジェクトをインスタンス化(作成、新規...)するオブジェクトは、そのクラス型の変数にそのオブジェクトを割り当てることによって、その参照を取得できます。

// Reference is now stored in 's' 
public ExampleClass s = new ExampleClass(); 

あなたがしたい場合は、クラス名前を知ることによってだけで使用可能です静的財産を作るのオプションを持っています。そのプロパティはそのクラスのすべてのインスタンスで共有され、クラス名を参照することによって外部クラスが参照できます(public staticとする)。

公開プロパティは、保存した参照によって参照されます。

//public property access 
s.foo 
s.bar(var) 

静的プロパティはクラス名で参照されます。

//static property access 
ExampleClass.foo 
ExampleClass.bar(var) 

インスタンスを作成してリファレンスをオブジェクトに保存したら、必要に応じてそのオブジェクトを渡すことができます。 OtherExampleClass型の下のオブジェクトは、そのコンストラクタで 's'への参照を受け取り、参照を保持するためにそれ自身のローカル変数に格納する必要があります。

public OtherExampleClass s2 = new OtherExampleClass(s); 
関連する問題