假设我们定义了两个类(A和B):
class A
{
public new virtual string ToString()
{
return "I'm class A object.";
}
}
class B : A
{
public override string ToString()
{
return "I'm class B object.";
}
}
如果我们写:
A a = new B();
Console.WriteLine(a);
" B" (namespace.B
)将显示在控制台中
也就是说,将调用类A(System.Object.ToString())的隐式祖先的ToString()方法。
为什么要调用System.Object类的方法,而不是类A或B?
答案 0 :(得分:1)
首先,如果你这样做:
Console.WriteLine(a.ToString());
Console.WriteLine(b.ToString());
它会写出你想要的两个字符串。
新的意味着您必须从ToString
实例显式调用A
。因此a.ToString()
有效。 ((object)a).ToString()
没有。
通过调用Console.WriteLine(a)
,您正在调用Console.Writeline(object)
重载。因此,WriteLine
函数正在使用object
引用,因此您将获得默认的object.ToString()
。
在两种情况下都要覆盖它,问题就消失了(我猜你已经知道了):
class A
{
public override string ToString()
{
return "I'm class A object.";
}
}
class B : A
{
public override string ToString()
{
return "I'm class B object.";
}
}