我對非虛方法如何解決的理解(在C#中)是依賴於變量的類型(而不是實例的類型)。非虛方法解析 - 爲什麼會發生這種情況
看看下面的代碼。
class Program
{
static void Main(string[] args)
{
Sedan vehicle = new Sedan();
vehicle.Drive();
vehicle.Accelerate();
}
}
abstract class VehicleBase
{
public void Drive()
{
ShiftIntoGear();
Accelerate();
Steer();
}
protected abstract void ShiftIntoGear();
protected abstract void Steer();
public void Accelerate()
{
Console.WriteLine("VehicleBase.Accelerate");
}
}
class Sedan : VehicleBase
{
protected override void ShiftIntoGear()
{
Console.WriteLine("Sedan.ShiftIntoGear");
}
protected override void Steer()
{
Console.WriteLine("Sedan.Steer");
}
public new void Accelerate()
{
Console.WriteLine("Sedan.Accelerate");
}
}
的控制檯窗口顯示以下內容:
Sedan.ShiftIntoGear
VehicleBase.Accelerate
Sedan.Steer
Sedan.Accelerate
這沒有意義,我相信會引發許多人的一個循環。如果現在宣佈變量車輛爲類型VehicleBase你
Sedan.ShiftIntoGear
VehicleBase.Accelerate
Sedan.Steer
VehicleBase.Accelerate
這是我想在前面的情況下,期望以及因爲該方法是加快非虛。
在之前的輸出中(與可變車輛類型爲Sedan一樣,我希望Sedan.Accelerate被調用而不是VehicleBase.Accelerate。現在,根據您從哪裏調用它(從內部或外部)行爲正在改變
在我看來,重新引入方法的重載解析規則優先,但我很難相信這是正確的/預期的行爲
不知道你在這裏找到困惑。你能解釋一下你發現的問題嗎? – Oded
我以爲我做到了。這兩個產出已經提供,我的期望也是如此。我將編輯我的帖子,以更清晰地解釋我的期望 –
如果您在'VehicleBase'中使'Accelerate'虛擬並在'Sedan'中覆蓋它,您將獲得您期望的行爲。 – juharr