父类和子类的实例计数

时间:2011-05-09 17:56:32

标签: c# inheritance instance

我有一个父类型,并且有一些继承自它的子类型。

我想确保只有一个父实例,也适用于所有子类型。父类型:

private static int _instanceCount = 0;

public ParentClass()
{
    protected ParentClass() // constructor
    {
        _instanceCount++;

    if (_instanceCount > 1)
        throw new exception("Only one instance is allowed.");
    }
}

示例子类:

private static int _instanceCount = 0;

public ChildClass() : ParentClass
{
    public ChildClass() : base() // constructor
    {
        _instanceCount++;

        if (_instanceCount > 1)
            throw new exception("Only one instance is allowed.");
    }
}

该解决方案适用于子类型,但是当它们调用基类构造函数时,我无法区分是否从其他类型调用基本构造函数,因此解决方案失败。

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:2)

你应该能够判断你是否从这样的子类中调用:

if( this.GetType().Equals(typeof(ParentClass)) )
{
    //we know we're not being called by a sub-class.
}

当然,您可以跳过在子类中递增计数的步骤,并且只在父类中执行...并且存在线程问题。

答案 1 :(得分:1)

听起来你想要Singleton的功能。

答案 2 :(得分:1)

可能有其他方法来处理你想要做的事情,例如使用单例,但是确保调用基础构造函数不会给你误报的一种方法是检查它的类型,例如:

protected ParentClass()
{
  if (!GetType().Equal(typeof(ParentClass)))
  {
    // The child class has taken care of the check aleady
    return;
  }
}

答案 3 :(得分:0)

好吧......这可能是一个非常糟糕的黑客......但是你可以从Environment.StackTrace获取堆栈跟踪,并在运行构造函数代码之前查看被调用者是否是你的子类。 哈哈...祝你好运! :)