分层嵌套通用接口

时间:2014-12-16 10:29:16

标签: c# generics interface

我有一系列分层嵌套的通用接口,例如,这样看起来像这样:

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
{
    ...
}

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

1 个答案:

答案 0 :(得分:2)

应该非常小心地使用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) { }

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