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()。
這就是爲什麼您必須在第二課中的'Sub'重新聲明中使用'new'關鍵字。你明確地掩蓋了第一類的方法。這裏不使用繼承或多態。您應該在One.Sub聲明中添加'virtual',在Two.Sub聲明中刪除'new'並在Two.Sub和Three.Sub聲明中添加'override' – dureuill
'obj = new classOne();'這裏我們引用new鍵入obj。在這種情況下,對象類型應該改變禮儀?爲什麼沒有發生?爲什麼它仍然在ClassOne中? – Dhinesh
@Dhinesh - 無論您分配給「obj」,編譯器總是會根據「obj」的靜態類型做出方法調用決策。運行時類型僅在您調用虛擬方法時使用。 'Add'是虛擬的,所以編譯器會調度到正確的版本。 'Sub'不是虛擬的,所以編譯器總是調用'classOne'實例。 – Sean