2016-04-25 15 views
2

Sagen wir, ich habe eine einfache C# Schnittstelle des TypsSchnittstelle Vererbung ohne Kovarianz Rückgabetyp

public interface ITimeSeriesData 

ITimeSeriesData Add(ITimeSeries timeSeries) 

Diese Schnittstelle stellt den Vertrag für eine Reihe von Zeitreihendaten. Der Einfachheit halber habe ich nur eine einzige Methode eingeschlossen, nämlich das Hinzufügen einer Zeitreihe und das Erhalten einer neuen Menge von Daten entsprechend dieser Addition (man denke an die Daten als unveränderlich, wenn also eine neue Zeitreihe hinzugefügt wird, ist die ursprüngliche Instanz unverändert) und ein neuer Satz Zeitreihendaten wird zurückgegeben. Ich habe auch eine andere Schnittstelle, die den Vertrag für Klassen darstellt, die auch Zeitreihendaten enthalten, aber wo es gilt, dass alle Zeitreihen die gleiche Anzahl von Elementen enthalten. Jetzt

public interface ISquareTimeSeriesData 

ISquareTimeSeriesData Add(ITimeSeries timeSeries) 

, im Idealfall, würde ich jede ISquareTimeSeriesData wie ein ITimeSeriesData zu sein. Und mit Kovarianz Rückgabetyp, konnte ich einfach schreiben

public interface ISquareTimeSeriesData : ITimeSeriesData 

ISquareTimeSeriesData Add(ITimeSeries timeSeries) 

und da jede ISquareTimeSeriesData wäre dann ein ITimeSeriesData sein, ich habe würde, dass jede Klasse Umsetzung der „ISquareTimeSeriesData hinzufügen (ITimeSeries Zeitreihe)“ Methode auch als Umsetzung zählen würde "ITimeSeriesData hinzufügen (ITimeSeries timeSeries)". Da C# jedoch keine Kovarianz vom Rückgabetyp hat, funktioniert die obige Lösung nicht.

Gibt es einen eleganten Ausweg? Derzeit habe ich einfach eine Methode .AsTimeSeriesData() in der ISquareTimeSeriesData-Schnittstelle, die alle ISquareTimeSeriesData als ITimeSeriesData zurückgibt. Dies ist jedoch nicht besonders elegant.

Antwort

1

Sie können dies tun, indem Sie die ursprüngliche Schnittstelle Add Methode verstecken, obwohl dies alles andere als ideal ist. Es ist jedoch möglich, eine funktionierende Lösung daraus zu machen.

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

Danke für die Antwort. Ich denke, die Lösung macht Sinn. Soweit ich das verstehe, erfordert es jedoch Klassen, die ISquareTimeSeriesData implementieren, um beide Add-Methoden zu implementieren (sowohl die für ITimeSeriesData als auch die für ISquareTimeSeriesData). Wenn ich diese Lösung iteriere (z. B. mit einem IDoubleSquareTimeSeriesData, das ISquareTimeSeriesData implementiert), würde ich am Schluss drei Add-Methoden implementieren und so weiter. Aber ich denke, da gibt es nicht viel zu tun. –

Verwandte Themen