2016-04-25 74 views
2

接口继承比方说,我有以下类型没有返回类型的协方差

public interface ITimeSeriesData 

ITimeSeriesData Add(ITimeSeries timeSeries) 

此接口表示一组时间序列数据的合同的一个简单的C#接口。为了简单起见,我只包含一种方法,即添加一个时间序列并获得与此相加相对应的一组新数据(将数据视为不可变的,因此当添加新时间序列时,原始实例不变,并返回一组新的时间序列数据)。我还有另外一个接口,它代表也包含时间序列数据的类的契约,但是它强制所有时间序列包含相同数量的元素。

public interface ISquareTimeSeriesData 

ISquareTimeSeriesData Add(ITimeSeries timeSeries) 

现在,理想情况下,我希望任何ISquareTimeSeriesData都是ITimeSeriesData。并用返回类型的协方差,我可以简单地写

public interface ISquareTimeSeriesData : ITimeSeriesData 

ISquareTimeSeriesData Add(ITimeSeries timeSeries) 

,并因为任何ISquareTimeSeriesData那么将是一个ITimeSeriesData,我有一个贯彻落实“ISquareTimeSeriesData添加(ITimeSeries时间序列)”的方法也可以是任何类只能算作实施“ITimeSeriesData添加(ITimeSeries timeSeries)”。但是,C#没有返回类型协方差,因此上述解决方案不起作用。

有没有一种优雅的方式呢?目前,我只是在ISquareTimeSeriesData接口中有一个方法.AsTimeSeriesData(),它将任何ISquareTimeSeriesData作为ITimeSeriesData返回。虽然这不是特别优雅。

回答

1

您可以通过隐藏原始界面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 
    } 
} 
+0

感谢您的回答。我认为这个解决方案很有意义。不过,据我所知,它需要实现ISquareTimeSeriesData的类来实现两个Add方法(包括ITimeSeriesData和ISquareTimeSeriesData)。因此,如果我迭代这个解决方案(例如有一个实现ISquareTimeSeriesData的IDoubleSquareTimeSeriesData),我最终不得不实现三个Add方法等等。但是我想这件事没有太多要做。 –