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.
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. –