2014-02-20 131 views
0

A類: -新對象創建C#

class classOne 
{ 
    public int intOne = 0; 
    public int Sub() 
    { 
     return 1; 
    } 
    public virtual int Add() 
    { 
     return 1; 
    } 
} 

二班: -

class classTwo:classOne 
{ 
    public new int Sub() 
    { 
     return 2; 
    } 
    public override int Add() 
    { 
     return 2; 
    } 

} 

第三類

class classThree : classTwo 
{ 
    public int Sub() 
    { 
     return 3; 
    } 

} 

的Program.cs

classOne obj = new classOne(); 
classThree obj3 = new classThree(); 
obj = obj3; 
Console.WriteLine(obj.Sub()); 

輸出爲1.

我的疑問是我用classOne初始化了一個obj,然後使用新的關鍵字classThree obj3 = new classThree();爲ClassThree分配了同一個對象。它如何叫classOne.sub()。這是怎麼發生的?我的理解是,它應該調用classThree.Sub()。

回答

1

您尚未將Sub設爲虛擬,因此編譯器將使用該變量的靜態類型來確定要調用哪個實例。由於obj的靜態類型爲classOne,因此它將調用classOne.Sub()

+1

這就是爲什麼您必須在第二課中的'Sub'重新聲明中使用'new'關鍵字。你明確地掩蓋了第一類的方法。這裏不使用繼承或多態。您應該在One.Sub聲明中添加'virtual',在Two.Sub聲明中刪除'new'並在Two.Sub和Three.Sub聲明中添加'override' – dureuill

+0

'obj = new classOne();'這裏我們引用new鍵入obj。在這種情況下,對象類型應該改變禮儀?爲什麼沒有發生?爲什麼它仍然在ClassOne中? – Dhinesh

+0

@Dhinesh - 無論您分配給「obj」,編譯器總是會根據「obj」的靜態類型做出方法調用決策。運行時類型僅在您調用虛擬方法時使用。 'Add'是虛擬的,所以編譯器會調度到正確的版本。 'Sub'不是虛擬的,所以編譯器總是調用'classOne'實例。 – Sean