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

标签 c# generics interface overriding

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/

相关文章:

c# - .NET 3D,从哪里开始?

C# - 更新需要猜测 AUTO_INCRMENT 的 ID

Java:泛型输入类型兼容性

c# - 修改实现泛型接口(interface)的泛型类中的值类型 C#

Java 接口(interface)多态性

c# - ng-grid 的水平滚动 - 2.0.11

c# - 是否可以强制类型参数在类上可以为空

c# - 通用的多个接口(interface)

arrays - symmetricDifference 的通用数组扩展

java - 实现嵌入在接口(interface)中的类