Ограничить создание экземпляров класса?
Я использую C#. Я создал класс, который может быть включен в любой c#.net проект (настольный или веб -), но я хочу, чтобы в этом приложении моего класса было создано только 10 объектов. Если экземпляры объекта создали более 10, то он должен дать ошибку или просто не будет работать.
здесь может быть две ситуации,
- я включу myclass.cs файл в любом проект или
- Я свяжу свой класс в DLL, а затем включу его в любой применение
в обеих ситуациях он должен через ошибку, если в приложении создано более 10 экземпляров моего класса.
этот вопрос задал мой учитель, он сказал мне искать ответ в Интернете, я пробовал, но нигде не нашел решения этой проблемы, я не слышал, что мы можем ограничивать объекты?
возможно ли это, если да, то как?
спасибо
6 ответов
сохранить статическую переменную с количеством созданных экземпляров. Увеличьте это число с каждой конструкцией объекта. Сделайте объект IDisposable и уменьшите это число при каждом вызове Dispose (). Если вы хотите, чтобы он был потокобезопасным, используйте Interlocked.Increment () и блокируется.Декремент (), чтобы изменить значение этой переменной вместо ++ и --.
Я считаю, что вы хотите какую-то форму шаблон многотонные.
шаблон multiton является вариацией шаблона singleton, но это позволяет использовать n экземпляров объекта. Подобно тому, как класс singleton имеет статическую переменную для хранения одного экземпляра, multiton часто реализуется со статическим массивом или картой экземпляров, в зависимости от того, как вы хотите получить доступ к экземплярам - массивы допускают только числовой доступ, но с помощью карты вы можете предоставьте строковые ключи своим экземплярам, сделав их именованными.
вам просто нужно использовать шаблон фабрики со счетчиком количества созданных экземпляров, после чего метод factory выдаст исключение / вернет значение null.
пример:
public class Foobar
{
private static int numInstances = 0;
public static Foobar CreateFoobar()
{
if (numInstances++ < 10)
{
return new Foobar();
}
return null;
}
protected Foobar()
{
...
}
}
вышеуказанный метод будет отлично работать для приложения с одним экземпляром, но для приложения с несколькими экземплярами вы, вероятно, захотите использовать семафор (реализация существует в System.Threading
), который предназначен именно для такого рода ситуации (ограничение доступа к ресурсам/объекты). Он обходит проблему нескольких экземпляров класса, запрашиваемого почти одновременно, и проверка количества не выполняется.
Я бы создал static integer и обновите его при создании экземпляра нового объекта.
class YourClass
{
static int Count = 0;
public YourClass()
{
Count++;
if(Count > 10)
{
//throw exception
}
}
}
Для утилизации экземпляра также создайте статический метод выгрузки (аналогичный AppDomain). Имейте реализацию вызова метода unload IDisposable, которая уменьшает счетчик, используя блокировку.Decrement, а также утилизировать экземпляр.
(Я предполагаю, что если вы ограничиваете количество экземпляров, у вас есть ресурсы в экземпляре для управления.)
Можно также использовать дженерики, чтобы разрешить повторное использование класса factory для ограничения экземпляров разный класс. Используйте ограничения, чтобы требовать от экземпляра реализации IDisposible и иметь конструктор по умолчанию. Также укажите нестатическое свойство для возврата фактического экземпляра.
public class foo : IDisposable
{
public foo() { ; }
public string Name;
public void Dispose() { ; }
// Real class would free up instance resources
}
LimitedInstance< foo > li = LimitedInstance< foo >.CreateInstance();
li.Instance.Name = "Friendly Name for instance";
// do stuff with li
LimitedInstance< foo >.UnloadInstance( ref li );
Единственная проблема-вы не можете перегрузить оператор присваивания в C#. Поэтому, если вы сделаете следующее:
li = null;
Вместо вызова метода unload экземпляр останется в куче, а счетчик количества экземпляров не будет уменьшаться, пока GC происходит.