2013-02-27 90 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; } 
}