gpt4 book ai didi

c# - 实现通用接口(interface)的问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:04 26 4
gpt4 key购买 nike

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

在基础dll中我设置了一系列接口(interface)

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 等没有类型参数。这特别奇怪,因为当我要求它实现接口(interface)时,它包括来自两个相关接口(interface)的所有成员。

最佳答案

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

使其中一个成为具有泛型类型的“主导”类,然后另一个可以只返回基接口(interface)。

例如:

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

值得看看您是否真的需要所有通用类型 - 您可能最好使用非通用底层接口(interface),因为使用这些接口(interface)编写代码会容易得多。

关于c# - 实现通用接口(interface)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3364047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com