如何使用C#中的通用接口从子对象引用父对象?

Iro*_*fin 5 .net c# generics interface .net-4.0

我有以下接口声明:

interface IOrder<T> where T: IOrderItem
{
     IList<T> Items { get; set; }
}

interface IOrderItem
{
     IOrder<IOrderItem> Parent { get; set; } // What do I put here?
}
Run Code Online (Sandbox Code Playgroud)

我希望列表中的项目具有对标题对象的引用,因此它可以使用标题中的ID和其他字段.

在我的具体课程中,它抱怨我没有正确实现"父".

class StoreOrder : IOrder<StoreOrderItem>
{
    public IList<StoreOrderItem> Items { get; set; }
}

class StoreOrderItem : IOrderItem
{       
    public StoreOrder Parent { get; set; } // This doesn't satisfy the interface
}
Run Code Online (Sandbox Code Playgroud)

我尝试设置IOrderItemas IOrderItem<T>并传入Parent类型,但由于Header类需要Item类类型而导致循环引用...我感到困惑.

有关如何正确实施此建议的任何建议?

Cha*_*ert 3

如果您像这样定义接口:

interface IOrder<T> where T : IOrderItem<T>
{
    IList<T> Items { get; set; }
}
interface IOrderItem<T> where T : IOrderItem<T>
{
    IOrder<T> Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样实现它们以获得您期望的功能:

class StoreOrder : IOrder<StoreOrderItem>
{
    public IList<StoreOrderItem> Items { get; set; }
}
class StoreOrderItem: IOrderItem<StoreOrderItem>
{
    public IOrder<StoreOrderItem> Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • @devgeezer - 你是对的。但是,我的实现将允许任何“IOrder&lt;StoreOrderItem&gt;”实现成为父级。“IOrderItem&lt;T&gt;”需要了解其父项的任何信息都应该在“IOrder&lt;T&gt;”接口中实现,因为两者之间的关系是在接口级别而不是实现级别定义的。 (2认同)