: http://herbsutter.com/2013/05/22/gotw-5-solution-overriding-virtual-functions/ 나는이 매우 이상한 행동을 가로 질러 왔을 때 :오버로딩 기본 방법은이 게시물에서 C++ 동작을 일치 그래서 만약 내가보고 C#을 놀고 있었는데
public class BaseClass
{
public virtual void Foo(int i)
{
Console.WriteLine("Called Foo(int): " + i);
}
public void Foo(string i)
{
Console.WriteLine("Called Foo(string): " + i);
}
}
public class DerivedClass : BaseClass
{
public void Foo(double i)
{
Console.WriteLine("Called Foo(double): " + i);
}
}
public class OverriddenDerivedClass : BaseClass
{
public override void Foo(int i)
{
base.Foo(i);
}
public void Foo(double i)
{
Console.WriteLine("Called Foo(double): " + i);
}
}
class Program
{
static void Main(string[] args)
{
DerivedClass derived = new DerivedClass();
OverriddenDerivedClass overridedDerived = new OverriddenDerivedClass();
int i = 1;
double d = 2.0;
string s = "hi";
derived.Foo(i);
derived.Foo(d);
derived.Foo(s);
overridedDerived.Foo(i);
overridedDerived.Foo(d);
overridedDerived.Foo(s);
}
}
출력
Called Foo(double): 1
Called Foo(double): 2
Called Foo(string): hi
Called Foo(double): 1
Called Foo(double): 2
Called Foo(string): hi
분명히 기본 클래스에서보다 구체적인 Foo (int)보다 암시 적으로 변환 된 int가 두 배가되는 것을 선호합니다. 또는 기본 클래스에서 Foo (int)를 숨 깁니까? 하지만 그렇다면 Foo (문자열)가 왜 숨겨져 있지 않습니까? 매우 일관성이 없다고 느낀다 ... Foo (int)를 오버라이드해도 상관 없다. 결과는 같습니다. 아무도 여기서 무슨 일이 일어날 지 설명 할 수 있습니까?
는 (- Liskov 모든 - 그래, 난 그것이 파생 클래스의 기본 방법에 과부하가 나쁜 관행 것을 알고 있지만 나는 아직도! OverriddenDerivedClass에서 푸 (INT)가 호출되지 않습니다 것을 기대하지 않을 것이다)
그것은 거기, – ose
을 아래로 스크롤합니다. "예 나는 그것이 파생 클래스의 기본 방법에 과부하가 나쁜 관행 것을 알고 - Liskov 모두"허, 무엇을 할 때? 기본 방법을 재정의 할 수 있습니까? 어쨌든 +1은 대답을 호기심으로 생각할 것입니다. – bas
분명히 두 번째 일괄 처리에서'overrideDerived'의 메소드를 호출 할 생각 이었습니까? – Rotem