public interface ITimeable {}
public class TimedDoor : ITimeable {}
public static class Timer
{
public static void Add(ITimeable obj)
{
Console.Write("Add with parameter - ITimeable");
}
public static void Add(TimedDoor obj)
{
Console.Write("Add with parameter - TimedDoor");
}
}
public class BaseClient<T> where T : ITimeable
{
public T TimedDoorObject;
public virtual void Init()
{
Timer.Add(TimedDoorObject);
}
}
public class Client : BaseClient<TimedDoor>
{
public Client()
{
TimedDoorObject = new TimedDoor();
}
public override void Init()
{
Timer.Add(TimedDoorObject);
}
}
이
Client.Init()
반환
"Add with parameter - TimedDoor"
에서
그러나 클라이언트가 초기화(), 여기에
public class Client : BaseClient<TimedDoor>
{
public Client()
{
TimedDoor = new TimedDoor();
}
}
, Client.Init()
반환 "Add with parameter - ITimeable"
를 오버라이드 (override)하지 않는 경우 어떻게 이런 일이 무엇입니까? TimedDoorObject
은 런타임 중에 두 경우 모두 동일합니다.
C#에서 과부하 해결은 * 메서드 본문 만 제공된 컴파일러에서 수행됩니다. C#에서는 컴파일러가 generic을 생성하는 데 사용할 유형을 알지 못합니다. C# generics는 * generic *이며, 템플릿 코드의 새 복사본이 모든 구성에서 처음부터 분석되는 C++ 에서처럼 * 템플릿 *이 아닙니다. –
두 경우에'Init' 메소드가 리턴하는 코드를 설명 할 때 문자열을 바꾼 것으로 보입니다. –
@JeppeStigNielsen이 수정되었습니다. 감사합니다 – db42