案例很简单,我有这个界面
public interface IHasNext
{
IHasNext NextItem { get; set; }
}
然后我尝试像这样实现它:
public class Item : IHasNext
{
public int Id { get; set; }
Item NextItem { get; set; }
}
但这不起作用,因为实现的属性 NextItem 不是同一类型(即使该类型实现了接口(interface))。所以有人可以向我解释这不起作用的原因,当您可以非常自由地交换它们实现的接口(interface)的类型时,甚至作为类型参数(至少在 IEnumerable 和 IQueryable 上)。
最佳答案
考虑这个代码:
public class BadItem : IHasNext
{
public IHasNext { get; set; }
}
现在:
IHasNext item = new Item();
item.NextItem = new BadItem();
这是完全有效的……但是您希望它在
Item
类上做什么?它的 NextItem
属性是 Item
类型,所以它不知道如何处理 BadItem
...基本上,这样做是不安全的。
您可能希望使您的界面通用:
public interface IHasNext<T> where T : IHasNext<T>
{
T NextItem { get; set; }
}
public class Item : IHasNext<Item>
{
public int Id { get; set; }
IHasNext<Item> NextItem { get; set; }
}
关于c# - 对接口(interface)和实现感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15114621/