首页 / C# / c# – 为什么调用这个重写方法?
c# – 为什么调用这个重写方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 为什么调用这个重写方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1504字,纯文字阅读大概需要3分钟。
内容图文
![c# – 为什么调用这个重写方法?](/upload/InfoBanner/zyjiaocheng/760/54cdaddc56f54a898e5e9beada8cc44a.jpg)
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()返回“添加参数 – 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对象,因此它能够链接到的最佳重载是void Add(ITimeable obj)版本.相比之下,在编译时客户端知道T表示TimedDoor,因此它使用void Add(TimedDoor obj)函数,因为它比void Add(ITimeable obj)更好地匹配.
内容总结
以上是互联网集市为您收集整理的c# – 为什么调用这个重写方法?全部内容,希望文章能够帮你解决c# – 为什么调用这个重写方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。