Абстрактный базовый класс, чтобы вынудить каждого производные классы быть Singleton

Как я делаю абстрактный класс, который должен вынудить каждого производные классы быть Singleton? Я использую C#.

9
задан casperOne 28 July 2012 в 17:50
поделиться

4 ответа

Если вы хотите включить проверку времени компиляции, это невозможно. Вы можете сделать это с помощью проверки во время выполнения. Это некрасиво, но возможно. Вот пример:

public abstract class Singleton
{
    private static readonly object locker = new object();
    private static HashSet<object> registeredTypes = new HashSet<object>();

    protected Singleton()
    {
        lock (locker)
        {
            if (registeredTypes.Contains(this.GetType()))
            {
                throw new InvalidOperationException(
                    "Only one instance can ever  be registered.");
            }
            registeredTypes.Add(this.GetType());
        }
    }
}

public class Repository : Singleton
{
    public static readonly Repository Instance = new Repository();

    private Repository()
    {
    }
}
3
ответ дан 4 December 2019 в 13:00
поделиться

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

для одноэлементной реализации + примеры см .: Реализация одноэлементного шаблона в C #

6
ответ дан 4 December 2019 в 13:00
поделиться

Singleton означает наличие частных конструкторов. Но вы знаете, что частные члены не могут наследоваться. В C++ были шаблоны, так что вы могли создать синглтон из шаблонного класса. В C# шаблонов нет, так что вам придется писать собственные частные конструкторы для каждого синглтона, который вы хотите.

3
ответ дан 4 December 2019 в 13:00
поделиться

Классы в java или C # не являются «первоклассными». Статическая часть класса не может быть унаследована или переопределена подклассами. См. этот ответ для получения более подробной информации. К тому же у вас нет понятия метакласса.

В таких языках, как Smalltalk или Ruby, вы можете определить новый метакласс Singleton , который определяет метод getInstance . Затем вы можете определить ClassA и ClassB как экземпляры метакласса Singleton . Затем оба класса автоматически предоставляют метод getInstance , который можно использовать для создания экземпляров objectA или objectB . Разве это не круто? Что ж, на практике вы не часто используете метакласс, и синглтон на самом деле является единственным их использованием, которое имеет смысл и о котором я знаю.

2
ответ дан 4 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: