3

案例很简单,我有这个接口

public interface IHasNext
{
    IHasNext NextItem { get; set; }
}

然后我尝试像这样实现它:

public class Item : IHasNext
{
    public int Id { get; set; }
    Item NextItem { get; set; }
}

但这不起作用,因为实现的属性 NextItem 不是同一类型(即使该类型实现了接口)。所以有人可以向我解释这不起作用的原因,当你可以相当自由地交换接口的类型时,它们甚至作为类型参数(至少在 IEnumerable 和 IQueryable 上)实现的接口。

4

3 回答 3

9

考虑这段代码:

public class BadItem : IHasNext
{
    public IHasNext { get; set; }
}

现在:

IHasNext item = new Item();
item.NextItem = new BadItem();

这是完全有效的......但你希望它在Item课堂上做什么?它的NextItem属性是 type 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; }
}
于 2013-02-27T14:34:33.377 回答
0

接口声明属性必须是 type IHasNext,你的代码应该是:

public class Item : IHasNext
{
    public int Id { get; set; }
    IHasNext NextItem { get; set; }
}
于 2013-02-27T14:36:09.710 回答
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; }
 }
于 2013-02-27T14:38:29.277 回答