2012-06-07 45 views
0

我有下面的代碼在主要片斷調用基類的樂趣()中使用

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

「這個」關鍵字(當一個派生類presen)我有

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

輸出來作爲「衍生」2次。這是預計的,因爲大多數重寫的方法被調用。

但是,是否可以調用基類的ToString()方法,在這種情況下,而不是調用派生的基類?

+0

歡迎的虛方法的樂趣。 – Powerlord

回答

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

你必須在孩子添加一個新方法:

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

可以解決這個獲得通過你的孩子使用類的new關鍵字,而不是覆蓋的ToString()。

然後,當您的對象被引用爲Child(或Child的子項)時,ToString()將映射到Child.ToString()。當它作爲基礎對象投射時(例如Parent),ToString()將映射到Parent.ToString()

雖然我不認爲這是必需的,但尤其是使用ToString()函數。

0

我想你已經觸及了原始問題代碼中的解決方案。你只需要直接調用base.ToString()。您的base.printer()調用仍在調用this.ToString(),它將從Child類調用重寫的版本。