继承和静态属性

Oli*_*ich 8 .net c# oop inheritance

我不明白以下现象,有人可以解释一下我的错误吗?

public class BaseClass
{
    public BaseClass()
    {
        BaseClass.Instance = this;
    }

    public static BaseClass Instance
    {
        get;
        private set;
    }
}

public class SubClassA : BaseClass
{
    public SubClassA() 
        : base()
    { }
}

public class SubClassB : BaseClass
{
    public SubClassB()
        : base()
    { }
}

class Program
{
    static void Main(string[] args)
    {
        SubClassA a = new SubClassA();
        SubClassB b = new SubClassB();

        Console.WriteLine(SubClassA.Instance.GetType());
        Console.WriteLine(SubClassB.Instance.GetType());

        Console.Read();
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,编译器应该通过继承生成一个新的Type,SubClassA和SubClassB实际上是拥有自己的静态变量的类型.但似乎该类的静态部分不是继承而是引用 - 我怎么会出错?

Dan*_*Tao 18

只有一个静态Instance属性,它被定义BaseClass,它也恰好是唯一可以改变它的类型(因为集合是private).

发生的事情是你的子类SubClassASubClassB每个都BaseClass在自己的构造函数中调用构造函数.此构造函数设置InstanceBaseClass正在初始化的实例.

示例代码中的最后一个这样的实例恰好是SubClassB; 因此,当您拨打电话时,将一个 Instance属性设置为此实例Console.WriteLine.

你可以反转你SubClassASubClassB对象的构造,你会看到Instance设置为一个实例SubClassA.


Pra*_*ana 13

.NET中的继承仅适用于实例库.静态方法是在类型级别上定义的,而不是在实例级别上定义的.这就是为什么覆盖不适用于静态方法/属性/事件...

静态方法只在内存中保存一次.没有为它们创建的虚拟表等.

如果在.NET中调用实例方法,则始终为其提供当前实例.这是.NET运行时隐藏的,但它确实发生了.每个实例方法都将第一个参数作为运行该方法的对象的指针(引用).静态方法不会发生这种情况(因为它们是在类型级别定义的).编译器应该如何决定选择要调用的方法?