Как я делаю абстрактный класс, который должен вынудить каждого производные классы быть Singleton? Я использую C#.
Если вы хотите включить проверку времени компиляции, это невозможно. Вы можете сделать это с помощью проверки во время выполнения. Это некрасиво, но возможно. Вот пример:
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()
{
}
}
это не сработает, потому что синглтону где-то нужен статический доступ, который нельзя принудительно использовать.
для одноэлементной реализации + примеры см .: Реализация одноэлементного шаблона в C #
Singleton означает наличие частных конструкторов. Но вы знаете, что частные члены не могут наследоваться. В C++ были шаблоны, так что вы могли создать синглтон из шаблонного класса. В C# шаблонов нет, так что вам придется писать собственные частные конструкторы для каждого синглтона, который вы хотите.
Классы в java или C # не являются «первоклассными». Статическая часть класса не может быть унаследована или переопределена подклассами. См. этот ответ для получения более подробной информации. К тому же у вас нет понятия метакласса.
В таких языках, как Smalltalk или Ruby, вы можете определить новый метакласс Singleton
, который определяет метод getInstance
. Затем вы можете определить ClassA
и ClassB
как экземпляры метакласса Singleton
. Затем оба класса автоматически предоставляют метод getInstance
, который можно использовать для создания экземпляров objectA
или objectB
. Разве это не круто? Что ж, на практике вы не часто используете метакласс, и синглтон на самом деле является единственным их использованием, которое имеет смысл и о котором я знаю.