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”
但是如果Client不重载Init(),
public class Client : BaseClient<TimedDoor>
{
public Client()
{
TimedDoor = new TimedDoor();
}
}
这里,Client.Init()
返回"Add with parameter - ITimeable"
这是怎么回事? TimedDoorObject
在运行时的两种情况下是相同的。
最佳答案
如果我们在调用 Timer.Add(TimedDoorObject)
时添加一些显式转换来表示 T
所代表的内容,它会使正在发生的事情变得更加明显。
public class BaseClient<T> where T : ITimeable
{
public T TimedDoorObject;
public virtual void Init()
{
Timer.Add((ITimeable)TimedDoorObject);
}
}
public class Client : BaseClient<TimedDoor>
{
public Client()
{
TimedDoorObject = new TimedDoor();
}
public override void Init()
{
Timer.Add((TimedDoor)TimedDoorObject);
}
}
因此,当 BaseClient
被编译时,它所知道的是 T
是某种 ITimeable
对象,因此它能够链接的最佳重载to 是 void Add(ITimeable obj)
版本。相反,在编译时 Client
知道 T
代表一个 TimedDoor
所以它使用 void Add(TimedDoor obj)
函数因为它比 void Add(ITimeable obj)
更好。
关于c# - 为什么调用这个重写的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19058264/