c# - 没有返回类型协变的接口(interface)继承

标签 c# interface covariance return-type

假设我有一个简单的 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/

相关文章:

Python键入TypeVar(A,B,covariant = True)是什么意思?

c# - LINQ-Sum 的不同行为和手动添加整数值

c# - 如何从linq查询中提取条件语句?

java - 为什么在转换到不相关的接口(interface)时会编译?

java - 使用 Java 接口(interface)作为参数强制执行严格(更好)类型安全的想法

c# - 泛型中的协方差 : Creating a Generic List with a Bounded Wildcard

c# - 如何在 DataGridView 中将行显示为列?

c# - c#中的垃圾收集误解

go - 模拟 mgo 链接函数

c# - 实例化参数化类型列表,更好地利用泛型和 Linq