案例很简单,我有这个界面

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/

10-13 05:53