我有三个接口,大致如下:IData,它围绕所需的数据IDataInfo来提供关于IData的元数据和
IDataProvider
{
IData GetData(IDataInfo iDataInfo);
}对于上述接口,我有几个派生接口。例如:
IBikeData : IData、IBikeDataInfo : IDataInfo和IBikeDataProvider : IDataProviderICarData : IData,ICarDataInfo : IDataInfo和ICarDataProvider : IDataProvider等。现在,在IData GetData(IDataInfo iDataInfo) for IBikeDataProvider和ICarDataProvider的具体实现中,我需要将传入的iDataInfo参数键入到各自的派生类型(IBikeDataInfo和ICarDataInfo)中,以便访问其他特定功能。对于每个具体实现中的这种类型设置,我感到有点不舒服,我认为这样做是不对的。有什么办法我可以重构我的设计来防止这种情况吗?
发布于 2019-08-20 17:13:37
假设您可以调整您的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
}
}https://stackoverflow.com/questions/57578408
复制相似问题