使用“this”关键字调用基类fun()(当存在派生类时)

时间:2012-06-07 17:52:55

标签: c#

我有以下代码段

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());
    }
}

在Main我有

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

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

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

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

没有。表格MSDN:

  

调用虚方法时,对象的运行时类型为   检查一个压倒一切的成员。最重要的成员   调用派生类,如果不是,则可以是原始成员   派生类已重写成员。

因此,即使您转换为Parent,该对象仍然是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());
    }
}

答案 2 :(得分:0)

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

public override string BaseToString()
{
     return base.ToString();
}

答案 3 :(得分:0)

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