防止单例类的子类调用单例的构造函数

时间:2012-11-13 11:04:48

标签: c# singleton subclass

好的,我有一个包含许多系统范围值的单例类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 

1 个答案:

答案 0 :(得分:7)

  

好的,我有一个单例类GraphMaster,它包含许多系统范围的值。我有一个子类GraphObject:GraphMaster,它具有图形特定的数据。

这是一个问题。只要你有一个具有子类的类,它就按照定义而不是一个单例。有人可以在任何时候添加另一个子类,即使你只有每个子类的一个实例,你也会有两个与基类兼容的不同实例。

可以在基类构造函数中添加一些东西,如果已经存在一个实例则抛出异常,但它会非常臭。从根本上说,单身人士与子课程不相容。重新思考你的设计。 (理想情况下,首先要避免单身模式,但那是另一回事......)