簡體   English   中英

使用“this”關鍵字調用基類fun()(當派生類是presen時)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM