[英]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.