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の型はであるため、 ...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

なぜあなたはそれを次のように実装していないのですか:

 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 に答える
0

インターフェイスは、プロパティが typeIHasNextである必要があることを示しています。コードは次のようになります。

public class Item : IHasNext
{
    public int Id { get; set; }
    IHasNext NextItem { get; set; }
}
于 2013-02-27T14:36:09.710 に答える