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

IDataProvider
{
   IData GetData(IDataInfo iDataInfo);
}


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


IBikeData : IDataIBikeDataInfo : IDataInfoIBikeDataProvider : IDataProvider
ICarData : IDataICarDataInfo : IDataInfoICarDataProvider : IDataProvider等。


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

最佳答案

假设您可以调整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
    }
}

07-27 13:21