假设我有一个简单的 C# 接口(interface),类型如下
public interface ITimeSeriesData
ITimeSeriesData Add(ITimeSeries timeSeries)
此接口(interface)表示一组时间序列数据的契约(Contract)。为了简单起见,我只包含了一个方法,即添加一个时间序列并获取与此添加对应的一组新数据(认为数据是不可变的,所以当添加一个新的时间序列时,原始实例是不变的,并返回一组新的时间序列数据)。我还有另一个接口(interface),它表示也包含时间序列数据的类的契约,但强制所有时间序列包含相同数量的元素。
public interface ISquareTimeSeriesData
ISquareTimeSeriesData Add(ITimeSeries timeSeries)
现在,理想情况下,我希望任何 ISquareTimeSeriesData 成为 ITimeSeriesData。有了返回类型协方差,我可以简单地写
public interface ISquareTimeSeriesData : ITimeSeriesData
ISquareTimeSeriesData Add(ITimeSeries timeSeries)
并且由于任何 ISquareTimeSeriesData 都将是 ITimeSeriesData,因此我认为任何实现“ISquareTimeSeriesData Add(ITimeSeries timeSeries)”方法的类也将算作实现“ITimeSeriesData Add(ITimeSeries timeSeries)”。然而,C# 没有返回类型协变,所以上面的解决方案不起作用。
有没有优雅的解决方法?目前,我在 ISquareTimeSeriesData 接口(interface)中只有一个方法 .AsTimeSeriesData(),它将任何 ISquareTimeSeriesData 作为 ITimeSeriesData 返回。不过,这并不是特别优雅。
最佳答案
您可以通过隐藏原始界面的 Add
方法来做到这一点,尽管这远非理想。不过,有可能从中制定出可行的解决方案。
public interface ITimeSeriesData
{
ITimeSeriesData Add(ITimeSeries timeSeries);
}
public interface ISquareTimeSeriesData : ITimeSeriesData
{
new ISquareTimeSeriesData Add(ITimeSeries timeSeries); // hide original
}
public class STSD : ISquareTimeSeriesData
{
public ISquareTimeSeriesData Add(ITimeSeries timeSeries)
{
// implement here
}
ITimeSeriesData ITimeSeriesData.Add(ITimeSeries timeSeries)
{
return this.Add(timeSeries); // call the overridden Add method
}
}
关于c# - 没有返回类型协变的接口(interface)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36836279/