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