C# c语言中抽象单例类的子类#

C# c语言中抽象单例类的子类#,c#,.net,singleton,abstract-class,C#,.net,Singleton,Abstract Class,在做一些关于抽象类和单例的工作时,我从StackOverflow中找到了许多有用的资源。然而,我仍然有一个关于独生子女的问题 我的单例代码如下所示,取自上的答案,如下所示: public abstract class Singleton<T> where T : Singleton<T> { private static readonly Lazy<T> _instance; static Singleton() {

在做一些关于抽象类和单例的工作时,我从StackOverflow中找到了许多有用的资源。然而,我仍然有一个关于独生子女的问题

我的单例代码如下所示,取自上的答案,如下所示:

public abstract class Singleton<T> where T : Singleton<T>
{
    private static readonly Lazy<T> _instance;

    static Singleton()
    {
        _instance = new Lazy<T>(() =>
        {
            try
            {
                // Binding flags include private constructors.
                var constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null);
                return (T)constructor.Invoke(null);
            }
            catch (Exception exception)
            {
                throw new SingletonConstructorException(exception);
            }
        });
    }
    public static T Instance { get { return _instance.Value; } }
}

公共类SingletonGrandChild:SingletonChild{[code]}
有人能提供一些关于这将是什么的见解吗?
谢谢

在建模继承时,子类考虑父类的
定义来创建继承关系。就您而言,正确答案是:

public class SingletonGrandChild : SingletonChild { [code] }
由于SingletonChild不在其类定义中声明泛型,因此从它继承时不需要这样做(实际上这样做会导致编译错误)


我不确定您试图通过此设置完成什么,但无论如何,我希望此信息有助于您全面理解。

两者都不会按您的意愿工作

第一种方法:

public class SingletonGrandChild : SingletonChild { [code] }
Console.WriteLine(SingletonGrandChild.Instance.GetType()); // prints SingletonChild
public class SingletonGrandChild : SingletonChild<SingletonGrandChild> { [code] }
第二种方法:

public class SingletonGrandChild : SingletonChild { [code] }
Console.WriteLine(SingletonGrandChild.Instance.GetType()); // prints SingletonChild
public class SingletonGrandChild : SingletonChild<SingletonGrandChild> { [code] }
公共类SingletonGrandChild:SingletonChild{[code]}
这将不允许您从SingletonChild继承任何代码

如果SingletonChild是抽象的,这将起作用:

public abstract class SingletonChild<T> : Singleton<T> where T:SingletonChild<T>{ [code] }

public class SingletonGrandChild : SingletonChild<SingletonGrandChild>{ [code] }
公共抽象类SingletonChild:Singleton其中T:SingletonChild{[code]}
公共类SingletonGrandChild:SingletonChild{[code]}
如果独生子女不是抽象的,我想你有问题。SingletonGrandChild将是一个实例,SingleTongChild将是另一个实例。这意味着,如果SingletonGrandChild实例访问SingletonChild类中的受保护字段,那么它将与SingletonChild实例中的字段不同


无论哪种方式,您都应该避免单例,并避免代码重用的继承(请参阅)。

该类是单例的事实真的与这个问题相关吗?你为什么不自己试试看呢?一旦你把基因从孩子身上移除,孙子们就没用了,因为基因就是它的父亲。另外,请仔细想想您使用单例的原因,特别是孙子,我一直不明白为什么会有人创建单例基类。Singleton是一种模式,而不是功能。将其设为基类可能会节省三到四行重复代码,但代价是浪费设置类型基类的唯一机会。不要这样做。一开始,基类是制造单身的错误方法。谢谢!我所处的情况是,我创建了一个模板(abatct类),但我想强制它的所有子对象都是单例,作为各种事情的控制器。
public abstract class SingletonChild<T> : Singleton<T> where T:SingletonChild<T>{ [code] }

public class SingletonGrandChild : SingletonChild<SingletonGrandChild>{ [code] }