Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对接口和实现感到困惑_C#_Inheritance_Interface - Fatal编程技术网

C# 对接口和实现感到困惑

C# 对接口和实现感到困惑,c#,inheritance,interface,C#,Inheritance,Interface,这个案例很简单,我有这个界面 public interface IHasNext { IHasNext NextItem { get; set; } } 然后我尝试这样实现它: public class Item : IHasNext { public int Id { get; set; } Item NextItem { get; set; } } 但这不会起作用,因为实现的属性NextItem不是同一类型(即使该类型实现了接口)。因此,如果您可以非常自由地将类型

这个案例很简单,我有这个界面

public interface IHasNext
{
    IHasNext NextItem { get; set; }
}
然后我尝试这样实现它:

public class Item : IHasNext
{
    public int Id { get; set; }
    Item NextItem { get; set; }
}
但这不会起作用,因为实现的属性NextItem不是同一类型(即使该类型实现了接口)。因此,如果您可以非常自由地将类型交换为接口,即使它们实现为类型参数(至少在IEnumerable和IQueryable上),请有人解释一下这不起作用的原因。

请考虑以下代码:

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

这是完全正确的。。。但是您希望它对
类做什么呢?它的
NextItem
属性属于
Item
类型,因此它不知道如何处理
badeitem

基本上,这样做是不安全的

您可能希望使您的界面成为通用界面:

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; }
}
公共接口IHasNext,其中T:IHasNext
{
T NextItem{get;set;}
}
公共类项目:IHasNext
{
公共int Id{get;set;}
IHasNext NextItem{get;set;}
}

接口说明属性必须是
IHasNext
类型,您的代码应该是:

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

为什么不将其实现为:

 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; }
 }
公共接口IHasNext
{
T NextItem{get;set;}
}
公共类项目:IHasNext
{
公共int Id{get;set;}
项NextItem{get;set;}
}

啊,这真是太有道理了,谢谢你的澄清!
public interface IHasNext<T>
{
    T NextItem { get; set; }
}

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