Подсчет экземпляров на родительских и детских классах - PullRequest
4 голосов
/ 09 мая 2011

У меня есть родительский тип, и от него наследуются некоторые дочерние типы.

Я хочу убедиться, что существует только один экземпляр родительского типа, а также для всех дочерних типов.Родительский тип:

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 ]

2 голосов
/ 09 мая 2011

Вы должны быть в состоянии определить, вызывается ли вас из подкласса, например так:

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

Конечно, вы можете просто пропустить шаг увеличения счетчика в дочерних классах и сделать это тольков родительском ... и есть проблемы с многопоточностью.

1 голос
/ 09 мая 2011

Вероятно, есть другие способы приблизиться к тому, что вы пытаетесь сделать, например, использовать Singletons, но один из способов убедиться, что вызов базового конструктора не дает ложного срабатывания, - это проверить его тип, например: :

protected ParentClass()
{
  if (!GetType().Equal(typeof(ParentClass)))
  {
    // The child class has taken care of the check aleady
    return;
  }
}
1 голос
/ 09 мая 2011

Звучит так, как будто вам нужна функциональность Singleton .

0 голосов
/ 09 мая 2011

хорошо ... это может быть очень плохим взломом ... но вы можете получить трассировку стека из Environment.StackTrace и посмотреть, был ли вызываемый объект вашим дочерним классом непосредственно перед выполнением кода конструктора. лол ... удачи! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...