2011-01-22 4 views
1

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

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 в соответствии с приведенным выше кодом?

+0

Какая польза от этого? Это для того, чтобы сделать синглтон? – Nekresh

+0

Звонящий является фабрикой «Синглтон», и я собираюсь удостовериться, что нет дубликатов. – Xaqron

+0

Вы можете поймать исключение и посмотреть, что он говорит. –

ответ

3

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

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

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

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


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

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

+0

Таким образом, процесс наследования сам по себе является потокобезопасным. Я думал, может быть, переменная 'static' в базовом классе является общей для всех детей. Я хочу, чтобы один экземпляр каждого «ребенка» не был «BaseClass», и вы говорите, что код делает это в «BaseClass» (вы правы). – Xaqron

+0

Я хочу, чтобы каждый дочерний элемент «Singleton», но проблема в том, что я использую «MEF» и «Lazy», поэтому мне не хватает контроля над процессом создания экземпляров (хотя «Lazy» поддерживает поточную безопасность). Я решил его заблокировать по вызову 'Lazy.Value', но все равно нужно быть уверенным в этом. – Xaqron

+0

Наследование является потокобезопасным: неприменимо. Но статический var определенно разделен и _not_ потокобезопасен. Ваш текущий код ограничивает его 1 на базовый класс, а не 1 на ребенка. –

2

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