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"
Почему этот переопределенный метод вызывается?
Но если клиент не отменяет Init(),
public class Client : BaseClient<TimedDoor>
{
public Client()
{
TimedDoor = new TimedDoor();
}
}
Здесь Client.Init()
возвращает "Add with parameter - ITimeable"
Как это происходит? TimedDoorObject
- это то же самое в обоих случаях во время выполнения.
В разрешении перегрузки C# выполняется только компилятором только * тело метода *; в C# компилятор не знает, какой тип вы собираетесь использовать для создания общего. C# generics являются * generic *, они не являются * шаблонами *, как на C++, где новая копия кода шаблона анализируется с нуля на каждой конструкции. –
Кажется, вы обменяли строки, когда описываете, под кодом, что метод 'Init' возвращает в двух случаях. –
@ JeppeStigNielsen фиксированный. спасибо – db42