分层嵌套泛型接口

本文关键字:泛型接口 嵌套 分层 | 更新日期: 2023-09-27 18:34:18

我有一串分层嵌套的泛型接口,例如如下所示:

ICar<TWheels, TBolts>
where TWheels : IWheels<TBolts>
where TBolts : IBolts
{
    IEnumerable<TWheels> Wheels { get; set; }
}
IWheels<TBolts>
where TBolts : IBolts
{
    IEnumerable<TBolts> Wheels { get; set; }
}
IBolts
{
}

这是处理这些通用接口的明智方法吗?

它使定义方法如下所示:

public TCar GetCar<TWheels, TBolts>(int id)
where TCar : ICar<TWheels, TBolts>
where TWheels : IWheels<TBolts>
where TBolts : IBolts
{
    ...
}

有没有办法减少此代码签名?

分层嵌套泛型接口

C# 中的泛型应非常谨慎地使用,以避免您遇到的问题。我建议修改接口层次结构并丢弃泛型:

interface ICar
{
    IEnumerable<IWheel> Wheels { get; set; }
}
interface IWheel
{
    IEnumerable<IBolt> Bolts { get; set; }
}
interface IBolt
{
}

然后,最好看看这些接口参与的用例。
可能是,在极少数情况下,您需要IR16Wheel而不是IWheel,类型转换就足够了。
也许,将非泛型接口与泛型接口配对就足够了:

interface IWheel<TBolt> : IWheel
    where TBolt : IBolt
{
    IEnumerable<TBolt> Bolts { get; set; }
}

并将非泛型与如下方法一起使用:

public ICar GetCar(int id) { }

但也在更具体的情况下使用泛型。