Я пытался реализовать одноэлементное наследование для моей системы журналов, поэтому я мог бы отделить системные события от поведения пользователя. Я нашел this nice post in Java. Несмотря на разницу Generics, я мог бы реализовать эту прикрепленную первую версию (ненавязчивость на некоторое время).Singleton Inheritance C#
public abstract class Log
{
private static volatile Dictionary<Type, Log> instances = new Dictionary<Type, Log>();
public static Log GetInstance(Type type) {
Log instance = null;
if (!Log.instances.ContainsKey(type))
{
ConstructorInfo ctor = type.GetConstructor(BindingFlags.Default,
null,
new Type[0],
new ParameterModifier[0]);
instance = ctor.Invoke(new object[0]) as Log;
instances.Add(type, instance);
}
else
{
instance = Log.instances[type];
}
return instance;
}
private Log() { }
public class UserLog : Log
{
private UserLog() : base() { }
}
public class SystemLog : Log
{
private SystemLog() : base() { }
}
}
В выделенной строке показана попытка создания нового экземпляра. Но это не работает и возвращает нулевой экземпляр ConstructorInfo.
1) Любые идеи о том, как использовать метод GetConstructor? Я знаю, что он имеет 3 перегруженные версии, но первый - только для публичных конструкторов. Если я изменю видимость конструктора публике, я могу использовать другую перегруженную версию (this one), но эту конкретную версию я не могу даже использовать с публичными конструкторами.
2) В C# можно ли вызвать частный конструктор из другого класса, как я пытаюсь сделать? Я реализовал его на Java, но на C# он может быть другим.
У одиночек есть частные конструкторы, поэтому вы не сможете использовать invoke. – tdbeckett
Вы не можете вызвать абстрактный класс. Сделать это Singleton не делает с тех пор. – tdbeckett
Невозможно обеспечить соблюдение требования Singleton для классов детей. – tdbeckett