案例非常简单,我有这个界面
public interface IHasNext
{
IHasNext NextItem { get; set; }
}
然后我尝试像这样实现它:
public class Item : IHasNext
{
public int Id { get; set; }
Item NextItem { get; set; }
}
但这不起作用,因为实现的属性NextItem不是同一类型(即使类型实现了接口)。所以有人可以向我解释这个不起作用的原因,当你可以非常自由地交换他们实现的接口的类型,甚至作为类型参数(至少在IEnumerable和IQueryable上)。
答案 0 :(得分:9)
考虑以下代码:
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; }
}
答案 1 :(得分:0)
该接口声明该属性必须是IHasNext
类型,您的代码应为:
public class Item : IHasNext
{
public int Id { get; set; }
IHasNext NextItem { get; set; }
}
答案 2 :(得分:0)
为什么不将其实施为:
public class Item : IHasNext
{
public int Id { get; set; }
IHasNext NextItem { get; set; }
}
?此接口可以在任何实现IHasNext
的类上。
但更好的是使其成为通用的
public interface IHasNext<T>
{
T NextItem { get; set; }
}
public class Item : IHasNext<Item>
{
public int Id { get; set; }
Item NextItem { get; set; }
}