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
的实例;因此,当您到达控制台时,oneInstance
属性被设置为此实例。WriteLine
调用
您可以反转子类
和子类b
对象的构造,您将看到实例
设置为子类
的实例。由于这些问题,单例类应该声明为密封的:我不明白为什么继承只对实例有效,但我不得不接受。感谢您提供的信息。相同的行为在PHP和中实现Delphi@VladislavRastrusny当前位置我不知道2010年的情况如何。但现在在2016年,PHP中有self::
和static::
。@Fandusanto这与这个问题无关。self和static只能从调用类内部使用。但我们讨论的是通过类名从外部调用静态方法。