gpt4 book ai didi

c# - 为什么调用这个重写的方法?

转载 作者:行者123 更新时间:2023-11-30 13:26:41 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com