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