我有3个界面,大致如下:
IData
环绕所需数据IDataInfo
,以提供有关IData
和
IDataProvider
{
IData GetData(IDataInfo iDataInfo);
}
对于上述接口,我有几个派生接口系列。例如:
IBikeData : IData
,IBikeDataInfo : IDataInfo
和IBikeDataProvider : IDataProvider
ICarData : IData
,ICarDataInfo : IDataInfo
和ICarDataProvider : IDataProvider
等。现在,在IData GetData(IDataInfo iDataInfo)
和IBikeDataProvider
的{{1}}的具体实现中,我需要将传入的ICarDataProvider
参数类型转换为各个派生类型(iDataInfo
和IBikeDataInfo
),以便其他人访问其他特定功能。对于每个具体实现中的这种类型转换,我感到有些不舒服,我认为这是不正确的。有什么方法可以重构我的设计以防止这种情况发生?
答案 0 :(得分:0)
在您可以调整IDataProvider
界面的前提下,似乎仿制药将是解决方案。如果您将一个互变和协变类型参数与您的IData
和IDataInfo
类型重合,则可以切换定义以获得类似这样的内容:
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
}
}