没有 return 类型协变的接口继承

Interface inheritance without return type covariance

假设我有一个简单的 C# 接口,类型如下

public interface ITimeSeriesData

ITimeSeriesData Add(ITimeSeries timeSeries)

此接口表示一组时间序列数据的合同。为了简单起见,我只包含了一个方法,即添加一个时间序列并获取与此添加对应的一组新数据(认为数据是不可变的,所以当添加一个新的时间序列时,原始实例是不变的, 并且 returned) 了一组新的时间序列数据。我还有另一个接口,代表 classes 的合同也包含时间序列数据,但强制所有时间序列包含相同数量的元素。

public interface ISquareTimeSeriesData

ISquareTimeSeriesData Add(ITimeSeries timeSeries)

现在,理想情况下,我希望任何 ISquareTimeSeriesData 成为 ITimeSeriesData。使用 return 类型协方差,我可以简单地写

public interface ISquareTimeSeriesData : ITimeSeriesData

ISquareTimeSeriesData Add(ITimeSeries timeSeries)

并且由于任何 ISquareTimeSeriesData 都将是 ITimeSeriesData,因此我认为任何实施 "ISquareTimeSeriesData Add(ITimeSeries timeSeries)" 方法的 class 也将算作实施 "ITimeSeriesData Add(ITimeSeries timeSeries)"。但是,C#没有return类型协变,所以上面的解决方案是行不通的。

有什么优雅的解决方法吗?目前,我在 ISquareTimeSeriesData 接口中只有一个方法 .AsTimeSeriesData(),它 return 将任何 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
    }
}