C# 中的覆盖和隐藏方法
Overriding and Hiding methods in C #
假设我们定义了两个 classes(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
) 将显示在控制台中。
也就是说,将调用 Class A (System.Object.ToString()) 的隐式祖先的 ToString() 方法。
为什么调用的方法是System.Objectclass,而不是classA或B?
首先,如果你这样做:
Console.WriteLine(a.ToString());
Console.WriteLine(b.ToString());
它写出你想要的两个字符串。
新的意味着您必须从 A
实例显式调用 ToString
。因此 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.";
}
}
假设我们定义了两个 classes(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
) 将显示在控制台中。
也就是说,将调用 Class A (System.Object.ToString()) 的隐式祖先的 ToString() 方法。
为什么调用的方法是System.Objectclass,而不是classA或B?
首先,如果你这样做:
Console.WriteLine(a.ToString());
Console.WriteLine(b.ToString());
它写出你想要的两个字符串。
新的意味着您必须从 A
实例显式调用 ToString
。因此 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.";
}
}