[英]Call Base class fun() in using “this” keyword (when a derived class is presen)
我有以下代码片段
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()方法,在这种情况下,而不是调用派生的基类?
您可以使用new关键字来解决这个问题,而不是覆盖Child类中的ToString()。
然后,当您的对象被引用为Child
(或Child的Child
)时,ToString()将映射到Child.ToString()
。 当它被转换为基础对象(例如Parent
)时,ToString()将映射到Parent.ToString()
。
我不认为这是必要的良好做法,尤其是使用ToString()函数。
编号表格MSDN:
调用虚方法时,将检查对象的运行时类型是否有覆盖成员。 如果没有派生类重写成员,则调用派生程度最大的类中的重写成员,该成员可能是原始成员。
因此,即使您转换为Parent
,该对象仍然是Child
因此将应用override。 问题是你从已被覆盖的父类调用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());
}
}
你必须在Child中添加一个新方法:
public override string BaseToString()
{
return base.ToString();
}
我想您已经在原始问题代码中触及了解决方案。 您只需要直接调用base.ToString()。 您的base.printer()调用仍在调用this.ToString(),它将从Child类调用重写版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.