【问题标题】:Overriding and Hiding methods in C #C#中的覆盖和隐藏方法
【发布时间】:2017-12-10 05:21:34
【问题描述】:

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

【问题讨论】:

标签: polymorphism overriding method-hiding


【解决方案1】:

首先,如果你这样做:

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

【讨论】:

  • 非常感谢。我真的忘记了对重载的 Console.WriteLine(Object) 方法的调用。这就是调用 Object 的 ToString() 方法的原因。
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多