2016-04-25 121 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方法等等。但是我想這件事沒有太多要做。 –