我有以下代码段
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()方法,在这种情况下,而不是调用派生的基类?
答案 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类调用重写版本。