Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承和静态属性_C#_.net_Oop_Inheritance - Fatal编程技术网

C# 继承和静态属性

C# 继承和静态属性,c#,.net,oop,inheritance,C#,.net,Oop,Inheritance,我不明白下面的现象,有人能解释一下我错了什么吗 public class BaseClass { public BaseClass() { BaseClass.Instance = this; } public static BaseClass Instance { get; private set; } } public class SubClassA : BaseClass { pub

我不明白下面的现象,有人能解释一下我错了什么吗

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();
    }
}

正如我所理解的,编译器应该通过继承生成一个新类型,即子类a和子类B实际上是具有自己静态变量的自己的类型。但是,类的静态部分似乎不是继承的,而是被引用的-我错在哪里?

在.NET中继承只在实例基础上工作。静态方法是在类型级别而不是实例级别上定义的。这就是为什么重写不适用于静态方法/属性/事件

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


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

只有一个静态的
实例
属性,它在
基类
中定义,这也是唯一可以更改它的类型(因为集合是
私有的

发生的情况是,您的子类
subassa
subassb
都在各自的构造函数中调用
BaseClass
构造函数。此构造函数将
实例
设置为要初始化的
基类
实例

示例代码中最后一个这样的实例恰好是
子类b
的实例;因此,当您到达
控制台时,one
Instance
属性被设置为此实例。WriteLine
调用


您可以反转
子类
子类b
对象的构造,您将看到
实例
设置为
子类
的实例。

由于这些问题,单例类应该声明为密封的:

我不明白为什么继承只对实例有效,但我不得不接受。感谢您提供的信息。相同的行为在PHP和中实现Delphi@VladislavRastrusny当前位置我不知道2010年的情况如何。但现在在2016年,PHP中有
self::
static::
。@Fandusanto这与这个问题无关。self和static只能从调用类内部使用。但我们讨论的是通过类名从外部调用静态方法。