没有返回类型协方差的接口继承



假设我有以下类型的简单 C# 接口

public interface ITimeSeriesData
ITimeSeriesData Add(ITimeSeries timeSeries)

此接口表示一组时序数据的协定。为简单起见,我只包含一个方法,即用于添加时间序列并获取与此添加对应的新数据集的方法(将数据视为不可变的,因此当添加新的时间序列时,原始实例保持不变,并返回一组新的时间序列数据)。我还有另一个接口,它表示也包含时间序列数据的类的协定,但强制所有时间序列都包含相同数量的元素。

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 接口中的 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
    }
}

最新更新