对接口和实现感到困惑

本文关键字:实现 接口 | 更新日期: 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; }
 }