对接口和实现感到困惑

时间:2013-02-27 14:31:51

标签: c# inheritance interface

案例非常简单,我有这个界面

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

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

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

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

3 个答案:

答案 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; }
 }