Трассировка экземпляров в базовом классе - PullRequest
1 голос
/ 22 января 2011

В настоящее время я отслеживаю количество экземпляров базового класса следующим образом:

private static int _instanceCount = 0;

protected BaseClass()
{
    Interlocked.Increment(ref _instanceCount);

    if (_instanceCount > 1)
        throw new Exception("multiple instances detected.");
}

Затем у меня есть дочерние классы с конструктором, подобным этому:

public ChildClass(): base()
{
    // Empty Constructor
}

, и я получаю исключения из курса,Я могу переместить код из конструктора BaseClass в конструктор ChildClass, но это своего рода избыточность (все дочерние элементы с одинаковым кодом).

Есть ли способ сделать это в BaseClass?

Значит ли получение исключения означает, что я действительно пытался создать более одного экземпляра ChildClass в соответствии с приведенным выше кодом?

Ответы [ 2 ]

3 голосов
/ 22 января 2011

Получает ли исключение означает, что я действительно пытался создать более одного экземпляра ChildClass в соответствии с приведенным выше кодом?

Это означает, что существует более 1 экземпляра базового класса (-derived).

Есть ли способ сделать это на BaseClass?

Что делать в базовом классе?Эта часть Вопросов неясна.Вы уже делаете это в базовом классе.


Но ваша установка не будет очень полезной, так как она позволит только 1 экземпляр базового класса и, следовательно, только 1 из производных классов.

Я предполагаю, что вы хотите, чтобы каждый производный класс был Singleton.Для реализации этого в базовом классе вам понадобится, например, статический HashSet, где вы можете использовать Typename (this.GetType().Name) в качестве ключа.

2 голосов
/ 22 января 2011

Если вы хотите фабрику Singleton, вы можете рассмотреть возможность использования контейнера IoC вместо того, чтобы катать свой собственный.Многие контейнеры IoC поддерживают стандартное поведение фабрики Singleton.Например, вы можете использовать Unity .

...