C#中的覆盖和隐藏方法

时间:2017-12-10 05:21:35

标签: polymorphism method-overriding method-hiding

假设我们定义了两个类(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?

1 个答案:

答案 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.";
    }
}