c# - 继承和静态属性

标签 c# .net 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();
    }
}

据我了解,编译器应该通过继承生成一个新类型,SubClassA 和 SubClassB 实际上是具有自己的静态变量的自己的类型。但似乎类的静态部分不是继承的而是引用的 - 我哪里错了?

最佳答案

只有一个静态 Instance 属性,它在 BaseClass 中定义,这也恰好是唯一可以更改它的类型(因为集合是 私有(private))。

发生的事情是您的子类 SubClassASubClassB 每个都在它们自己的构造函数中调用 BaseClass 构造函数。此构造函数将 Instance 设置为正在初始化的 BaseClass 实例。

您的示例代码中的最后一个此类实例恰好是 SubClassB 的实例;因此,当您到达 Console.WriteLine 调用时,one Instance 属性设置为此实例。

您可以反转SubClassASubClassB 对象的构造,您会看到Instance 设置为SubClassA< 的实例 代替。

关于c# - 继承和静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3776305/

相关文章:

c# - 在 wpf 应用程序中嵌入链接的最用户友好的方式是什么?

c# - 在 .net 中使用 JsonConvert 对具有可变长度的对象进行 JSON 序列化

c# - 面向对象的概念适用于C语言吗?

JavaScript OO - 如何制作一个巨大的面向对象的应用程序并使用静态成员

c# - 使 Div 填充内容的宽度而不仅仅是屏幕

c# - 将键盘事件发送到 C# 中不处理 Windows 事件的另一个应用程序

c# - 如何让 T4ReferencePath 工作?

c# - 从 C++ 到 C# 的回调

时间:2019-05-17 标签:c#uwptooltipplacementpropertynotupdate

php oop mysql 查询