1

定義されたClassAがあるとしましょう。ClassBはClassAを拡張し、ClassBにリンクされたステージ上にMovieClipインスタンスがあります。

ClassCは、ClassBを拡張したり、ClassBの新しいインスタンスを作成したりせずに、ClassBのプロパティとメソッドにどのようにアクセスしますか?

私が現在行っている方法は、ClassBにリンクされたステージインスタンスを参照し、ドット構文を使用してClassBインスタンス変数にアクセスすることです。これは、アクセスされた変数がパブリックまたは内部である場合にのみ機能します。これは、ClassCがどのパッケージに含まれているかによって異なります。の。これを達成するためのより良い、よりクリーンな方法があるかどうか知りたいです。

編集:コード例。

package com.core.stage.classes {

    import flash.display.MovieClip;

    public class ClassA extends MovieClip {

        public var classAvar:uint = 0;

        public function ClassA() {

        }

        protected function classAfunction(funPar:uint):void {
            classAvar = 2 * funPar;
        }

    }

}

package com.core.stage.classes {

    import com.core.stage.classes.ClassA;

    public class ClassB extends ClassA {

        public function ClassB() {
            classAfunction(10);
        }

    }

}

package com.core.stage.classes {

    import flash.display.MovieClip;

    public class ClassC extends MovieClip {

        private var classBreference:*;

        public function ClassC() {
            classBreference = Object(parent);
            trace(classBreference.classAvar); // Outputs 20.
        }

    }

}

したがって、基本的に知りたいのは、ClassCでの作業中にclassAvarの値(ClassAで宣言され、ClassBのメソッドを呼び出した後に値を取得)を取得するためのより良い方法があるかどうかです。

解決済み:

わかりました。いくつかの調査とdaniel.sedlacekから得たアイデアの結果、自分のニーズに最適なソリューションを見つけたようです。

ClassBの場合:

private static var _instance:ClassB;

public function ClassB() { // constructor
    _instance = this;
}


public static function get FUN_GetInstance():ClassB {
 return _instance; 
}

ClassCの場合:

private var MC_VariablesContainer:ClassB
MC_VariablesContainer:MC_ClassB = ClassB.FUN_GetInstance
4

2 に答える 2

2

これは、ClassC が含まれているパッケージに応じて、アクセスされた変数が public または internal である場合にのみ機能します。これを達成するためのより良い、よりクリーンな方法があるかどうか知りたいです。

これは、OOP の基本原則の 1 つです。プライベートおよび保護されたプロパティまたはメソッドを取得することはできません。それらを取得したい場合は、それらを公開または内部にする必要があります。

于 2012-01-09T16:06:11.633 に答える
1

A) そうしないでください。カプセル化の疎結合を尊重するより良いアーキテクチャを考えてください。

B)それをしなければならない場合は、静的グローバルレジスタを使用して、すべてのステージインスタンス(ClassBなど)をそれに割り当てることができます。たとえば、次のようになります。

クラスB:

StaticRegister.assign(this);

StaticRegister で:

publis static var register : Array = [];

public static function assign(instance : Object) : void {
   array.push(instance);
}

そして、同様の方法でそこから取り出します。しかし、このようにするのは本当に汚いです。

C) ClassB のインスタンスが 1 つしかない場合は、それに static (シングルトンのような) アクセサーを与えることができます。

クラス B では:

private static var instance : ClassB;  

publis static function getInstance() : ClassB {
  return instance;
 }

コンストラクターで:

public class ClassB() {
   instance = this;
}

完全なシングルトンの詳細: www.actionscript.orgまたは Google または Wikipedia。

于 2012-01-09T15:57:35.633 に答える