2011-06-10 86 views
1

我想知道,如果有人可以請給我講解一下:接口,繼承和「新」的關鍵字

class Program 
{ 
    static void Main() 
    { 
     AnotherDerivedClass d = new AnotherDerivedClass(); 
     Console.WriteLine(d.PrintMessage()); 

     IMsg m = d as IMsg; 
     //Why this prints BaseClass. 
     //How does it know that IMsg is implemented in the BaseClass. 
     Console.WriteLine(m.PrintMessage()); 

     IMsg n = d as DerivedClass; 
     //Why this prints BaseClass and not DerivedClass 
     Console.WriteLine(n.PrintMessage()); 

     Console.Read(); 
    } 
} 

public interface IMsg 
{ 
    string PrintMessage(); 
} 

public class BaseClass : IMsg 
{ 
    public string PrintMessage() 
    { 
     return "BaseClass"; 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public new string PrintMessage() 
    { 
     return "DerivedClass"; 
    } 
} 

public class AnotherDerivedClass : DerivedClass 
{ 
    public new string PrintMessage() 
    { 
     return "AnotherDerivedClass"; 
    } 
} 
+0

你有什麼問題? ...啊,我看到你的代碼中有評論:) – 2011-06-10 14:20:35

+2

在問題主體中提問而不是在代碼評論中更好,因爲人們在代碼清單中尋找問題的方法...... – Oded 2011-06-10 14:21:47

+0

I認爲如果我在代碼評論中提出問題,人們很容易理解我想要理解的內容。 – Asdfg 2011-06-10 14:24:59

回答

7

您已經在派生類替換實現,而不是覆蓋它們。如果您使用BaseClass,則將使用原始實現。

您需要在基礎虛擬的方法:

public class BaseClass : IMsg 
{ 

    public BaseClass() 
    { 

    } 

    public virtual string PrintMessage() 
    { 
     return "BaseClass"; 
    } 
} 

,並覆蓋在派生類:

public class DerivedClass : BaseClass 
{ 
    public DerivedClass() 
    { 

    } 

    public override string PrintMessage() 
    { 
     return "DerivedClass"; 
    } 
} 

讓你指定的行爲。

+0

我的理解是「新」關鍵字將隱藏基類實現。因此,如果基類實現是隱藏的,那麼它是否會調用New實現? – Asdfg 2011-06-10 14:27:50

+2

@Asdfg,這不是它的工作原理。當基本方法沒有做你想做的事情時,使用'new',它不是'virtual',不能被重寫。但是,只有在您通過對派生類型的引用進行操作時,纔會隱藏*基本實現。通過基類引用對象*將繼續使用基本行爲。這就是爲什麼在你真正打算在派生類中重寫的基礎方法上使用'virtual'修飾符是絕對可取的。 – 2011-06-10 14:33:20

+0

謝謝你的解釋。 – Asdfg 2011-06-10 20:00:13