2013-02-27 110 views
3

的情况下,很简单,我有这样的接口困惑接口和实现

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

,然后我试图实现它,像这样:

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

但这不会因为工作属性NextItem的实现不是相同的类型(即使类型实现了接口)。所以如果有人能够非常自由地交换他们实现的接口的类型,甚至可以作为类型参数(至少在IEnumerable和IQueryable上),那么是否可以向我解释造成这种情况的原因。

回答

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; } 
} 
+0

啊是非常有意义的确,感谢明确澄清! – bobblez 2013-02-27 14:37:03

+0

Ite,missa est !!! – 2013-02-27 14:37:45

0

接口指出属性必须是IHasNext型的,你的代码应该是:

public class Item : IHasNext 
{ 
    public int Id { get; set; } 
    IHasNext NextItem { get; set; } 
} 
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; } 
}