0

我有以下代码片段

Class Parent
{
    public override String ToString()
    {
            return "in Parent";
    }

    public virtual void printer()
    {
           Console.write(this.ToString());
    }
}

Class Child : Parent
{
    public override String ToString()
    {
            return "in Derived";
    }

    public override void printer()
    { 
           base.printer();
           Console.write(this.ToString());
    }
}

在主要我有

Parent p = new Derived();
p.printer();

输出为“In Derived”2 次。这是预期的,因为调用了大多数覆盖的方法。

但是,是否可以调用基类的 ToString() 方法,在这种情况下,而不是基类调用派生类?

4

4 回答 4

1

可以通过使用new关键字来解决此问题,而不是在 Child 类中覆盖 ToString()。

然后,当您的对象被引用为Child(或 的子级Child)时, ToString() 将映射到Child.ToString(). 当它被转换为基础对象(例如Parent)时,ToString() 将映射到Parent.ToString().

不过,我认为这不是很好的做法,尤其是使用 ToString() 函数。

于 2012-06-07T18:04:58.960 回答
1

没有。表格 MSDN:

调用虚拟方法时,会检查对象的运行时类型以查找覆盖成员。调用最派生类中的重写成员,如果没有派生类重写该成员,则该成员可能是原始成员。

因此,即使您转换为Parent,该对象仍然是 a Child,因此将应用覆盖。问题是您是ToString()从已被覆盖的父类调用的,因此如果实例是Child.

解决它的一种方法是创建一个单独的私有函数而不是使用ToString()

public class Parent
{
    public override String ToString()
    {
        return ToStringPrivate();
    }

    private string ToStringPrivate()
    {
        return "in Parent";
    }

    public virtual void printer()
    {
        Console.WriteLine(this.ToStringPrivate());
    }
}

public class Child : Parent
{
    public override String ToString()
    {
        return "in Derived";
    }

    public override void printer()
    {
        base.printer();
        Console.WriteLine(this.ToString());
    }
}
于 2012-06-07T18:10:36.943 回答
0

您必须在 Child 中添加一个新方法:

public override string BaseToString()
{
     return base.ToString();
}
于 2012-06-07T17:57:44.500 回答
0

我认为您已经触及原始问题代码中的解决方案。您只需要直接调用 base.ToString() 即可。您的 base.printer() 调用仍在调用 this.ToString() ,它将从 Child 类调用覆盖的版本。

于 2012-06-07T18:05:23.613 回答