实现通用接口的问题

时间:2010-07-29 15:12:50

标签: c# generics inheritance

我有一个基本DLL,它定义了我们业务中关键概念的一些基本结构和操作。然后,此dll将包含在每个供应商的特定Web服务中,这些供应商实现与该供应商交互的特定业务规则。 (虽然基本概念是相同的,但实现方式非常不同,可以独立更改。)

在base dll中我设置了一系列接口

public interface IVendor
{
    string Name { get; set; }    
}

public interface IVendor<TC> : IVendor where TC : IAccount
{
    IEnumerable<TC> Accounts { get; set; }
}

public interface IAccount
{
    string Name { get; set; }
}

public interface IAccount<TP, TC> : IAccount where TP : IVendor
                                             where TC : IExecutionPeriod
{
    TP Vendor{ get; set; }
    IEnumerable<TC> ExecutionPeriods { get; set; }
}

这继续下去几层,一切都很好。

当我尝试在服务中实现此问题时,问题出现了。

public class FirstVendor : IVendor<FirstVendorAccount>
{
    public string Name { get; set; }
    public IEnumerable<FirstVendorAccount> Accounts { get; set;}
}

public class FirstVendorAccount : IAccount<FirstVendor, FirstVendorExecutionPeriod>
{
    public FirstVendor Vendor { get; set; }
    public string Name { get; set; }
    public IEnumerable<FirstVendorExecutionPeriod> ExecutionPeriods { get; set; }
}

我收到编译错误,IVendor,IAccount等没有类型参数。这特别奇怪,因为当我要求它实现接口时,它包括来自两个相关接口的所有成员。

1 个答案:

答案 0 :(得分:1)

看起来你有一个循环引用 - FirstVendorAccount需要知道FirstVendor才能编译,反之亦然。

使用泛型类型创建其中一个“显性”类,然后另一个可以返回基本接口。

例如:

public interface IVendor
{
    string Name { get; set; }    
}

public interface IVendor<TC> : IVendor where TC : IAccount
{
    IEnumerable<TC> Accounts { get; set; }
}

public interface IAccount
{
    string Name { get; set; }
}

// no longer needs IVendor<TC> before it can be compiled
public interface IAccount<TC> : IAccount where TC : IExecutionPeriod
{
    IVendor Vendor{ get; set; }
    IEnumerable<TC> ExecutionPeriods { get; set; }
}

值得看看你是否真的需要所有通用类型 - 你可能会更好地使用非通用底层接口,因为这些接口编码会更容易。