我可以避免将接口方法参数的类型转换转换为同一类家族的具体类型吗?

时间:2019-08-20 16:58:26

标签: java c# interface polymorphism refactoring

我有3个界面,大致如下: IData环绕所需数据IDataInfo,以提供有关IData

的元数据
IDataProvider
{
   IData GetData(IDataInfo iDataInfo);
}

对于上述接口,我有几个派生接口系列。例如:

  1. IBikeData : IDataIBikeDataInfo : IDataInfoIBikeDataProvider : IDataProvider
  2. ICarData : IDataICarDataInfo : IDataInfoICarDataProvider : IDataProvider等。

现在,在IData GetData(IDataInfo iDataInfo)IBikeDataProvider的{​​{1}}的具体实现中,我需要将传入的ICarDataProvider参数类型转换为各个派生类型(iDataInfoIBikeDataInfo),以便其他人访问其他特定功能。对于每个具体实现中的这种类型转换,我感到有些不舒服,我认为这是不正确的。有什么方法可以重构我的设计以防止这种情况发生?

1 个答案:

答案 0 :(得分:0)

在您可以调整IDataProvider界面的前提下,似乎仿制药将是解决方案。如果您将一个互变和协变类型参数与您的IDataIDataInfo类型重合,则可以切换定义以获得类似这样的内容:

public interface IDataProvider<in TIn, out TOut> where TIn : IDataInfo 
                                                 where TOut : IData 
{
    TOut GetData(TIn dataInfo);
}

然后可以将您的IBikeDataProvider接口声明如下:

public interface IBikeDataProvider : IDataProvider<IBikeDataInfo, IBikeData> { }

这将导致以下具体的类实例:

public class BikeDataProvider : IBikeDataProvider
{
    public IBikeData GetData(IBikeDataInfo dataInfo)
    {
        // Do things
    }
}