C# c语言中抽象单例类的子类#
在做一些关于抽象类和单例的工作时,我从StackOverflow中找到了许多有用的资源。然而,我仍然有一个关于独生子女的问题 我的单例代码如下所示,取自上的答案,如下所示: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() {
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] }