对接口和实现感到困惑
本文关键字:实现 接口 | 更新日期: 2023-09-27 18:01:18
情况很简单,我有这个接口
public interface IHasNext
{
IHasNext NextItem { get; set; }
}
然后我尝试像这样实现它:
public class Item : IHasNext
{
public int Id { get; set; }
Item NextItem { get; set; }
}
,但这不起作用,因为实现的属性NextItem不是相同的类型(即使该类型实现了接口)。所以,有人可以解释一下这不起作用的原因,当你可以相当自由地交换接口的类型,他们实现甚至作为类型参数(至少在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; }
}
接口声明属性必须是IHasNext
类型,你的代码应该是:
public class Item : IHasNext
{
public int Id { get; set; }
IHasNext NextItem { get; set; }
}
为什么不这样实现呢:
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; }
}