初始化单例后代的实例



在传统的单例中,您可以这样初始化实例:

private static readonly Messages _instance = new Messages();

然后你通过getter来访问它,像这样:

    public static Messages Instance {
        get {
            return _instance;
        }
    }

在这种情况下,我们有一个父节点和多个子节点。

在父元素中我们有

    protected static Base _instance;
    public static Base Instance {
        get {
            return _instance;
        }
    }

在子类中,使用类构造函数填充静态变量。

    static Derived() {
        _instance = new Derived();
    }

这应该是有效的,因为类的构造函数是在类第一次被引用时调用的,然后才被使用。由于某些原因,这不起作用。

   Derived.Instance.Initialize();

失败,因为Instance为空,并且构造函数中的断点从未被命中。

Update: Base构造函数被调用,但是派生构造函数没有被调用。这可能是因为在类上调用静态方法时触发了静态构造函数。我调用的静态方法是在父类上,而不是在后代类上。

它不执行Derived构造函数,因为即使你写Derived.Instance, c#是聪明的,意识到Instance实际上是在Base上定义的-并将调用重写为Base.Instance.Initialize(),所以它不初始化Derived

无论如何,这似乎是一个非常糟糕的主意。当您创建并引用同样设置实例的Derived2时会发生什么?现在你又去打击Derived.Instance了。

在不知道为什么这样做的情况下,解决方法是在派生上定义一个静态成员,该成员在Derived.Instance之前被外部引用,或者在Derived上创建一个new static Derived Instance

下面是一个示例,演示Dervied2将覆盖实例:

void Main()
{
    //Prints null
    Console.WriteLine(Derived.Instance?.Name);
    //Prints Derived
    var a = Derived.InitDerived;
    Console.WriteLine(Derived.Instance?.Name);
    //Prints Derived2
    var b = Derived2.InitDerived;
    Console.WriteLine(Derived.Instance?.Name);
}
public class Base
{
    public string Name { get; set; }
    protected static Base _instance;
    public static Base Instance
    {
        get
        {
            return _instance;
        }
    }
}
public class Derived : Base
{
    public static int InitDerived = 1;
    static Derived()
    {
        _instance = new Derived() { Name = "Derived" };
    }
}
public class Derived2 : Base
{
    public static int InitDerived = 2;
    static Derived2()
    {
        _instance = new Derived()  { Name = "Derived2" };
    }
}

我调用的静态方法是在父类上,而不是在后代类上。

这就是问题所在。由于调用了属于父类的静态方法,因此调用了基类的构造函数。

在调用后代类的静态方法之前,不会调用后代类的构造函数。

Derived1.EmptyStaticMethod(); //This provokes the class constructor
Derived2.EmptyStaticMethod();
Derived1.Instance.Initialize(); // This now works.

相关内容

  • 没有找到相关文章

最新更新