비가 상 메서드를 해결하는 방법을 이해하려면 (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
이 나에게 이해가되지 않습니다 내가 루프 많은 사람들을 던질 것이라고 생각합니다. 당신이 방법 가속이 아닌 가상이기 때문에 나뿐만 아니라 이전의 경우에 기대할 수있는 것입니다
Sedan.ShiftIntoGear
VehicleBase.Accelerate
Sedan.Steer
VehicleBase.Accelerate
를 얻을 VehicleBase 당신은 지금 형으로 변수 차량을 선언합니다.
이전 출력에서 (세단 형 자동차로 입력 된 변수 차량에서는 VehicleBase.Accelerate 대신 Sedan.Accelerate가 호출 될 것으로 예상됩니다. 클래스 또는 외부에서) 행동이 바뀌고 있습니다.
다시 소개 된 메서드에 대한 과부하 해결 규칙이 우선시되는 것으로 보이지만 이것이 올바른/예상 된 동작이라고 믿는 데 어려움이 있습니다.
여기에 당황한 것을 잘 모릅니다. 문제가되는 것을 설명해 주시겠습니까? – Oded
나는 내가 그랬다고 생각했다. 두 가지 결과물이 제공되었고 나의 기대도있었습니다. 내 기대를 더 명확하게 설명하기 위해 내 게시물을 편집합니다. –
'VehicleBase'에서'Accelerate' 가상을 만들고'Sedan'에서 그것을 오버라이드하면 기대했던 동작을 얻을 수 있습니다. – juharr