0

わかりました、GraphMasterシステム全体の値を多数含むシングルトン クラスがあります。GraphObject : GraphMasterグラフ固有のデータを持つサブクラスがあります。サブクラス化することで、グローバル クラスまたはサブクラスのメンバーにアクセスできます。また、シングルトン クラスを使用することで、グローバル変数を任意の場所で変更し、すべてのサブクラスに反映させることができます。

ただし、基本クラスのコンストラクターがシングルトン クラスのコンストラクターを呼び出したいのですが、プライベートとマークされているためできません。

どうすればこれを回避できますか? 私がやろうとしていることは可能ですか?この投稿への回答により、私はこの道をたどりました: Can I make a "global" object to store variables for multiple objects?

例えば、

public class GraphMasterObject {
    private static GraphMasterObject instance;
    private GraphMasterObject() {   }
    }

    public static GraphMasterObject Instance {
        get {
            if (instance == null) instance = new GraphMasterObject();
            return instance;
        }
    }
    public int globalVar=10;
}

public class GraphObject : GraphMasterObject {

   public GraphObject() {
   }

   public int localVar=20;
}

できるようになりたい

GraphObject go = new GraphObject();
go.globalVar <- this is 10
GraphMasterObject.Instance.globalVar = 20;
go.globalVar <- now this is 20 
4

1 に答える 1

7

わかりました、システム全体の値を多数含むシングルトン クラス GraphMaster があります。グラフ固有のデータを持つサブクラス GraphObject : GraphMaster があります。

それは最初から問題です。サブクラスを持つクラスがあるとすぐに、それは定義上シングルトンではありません。誰かがいつでも別のサブクラスを追加できます。各サブクラスのインスタンスが 1 つしかない場合でも、基本クラスと互換性のある 2 つの異なるインスタンスがあります。

基底クラスのコンストラクターに何かを追加して、インスタンスが既に存在する場合に例外をスローすることもできますが、かなり臭くなります基本的に、シングルトンはサブクラス化と互換性がありません。デザインを再考してください。(理想的には、そもそもシングルトン パターンを避けることですが、それは別の問題です...)

于 2012-11-13T11:07:25.103 に答える