Flexibles Typsystem in C (Teil 3)
Kommentare

Covariance & Contravariance
Durch Erweiterung des letzten Beispiels kann das Zusammenspiel zwischen Covariance und Contravariance demonstriert werden. Wie in Listing 4 zu sehen war, kann ein Übergabeparameter

Covariance & Contravariance

Durch Erweiterung des letzten Beispiels kann das Zusammenspiel zwischen Covariance und Contravariance demonstriert werden. Wie in Listing 4 zu sehen war, kann ein Übergabeparameter unter Umständen implizit auf einen übergeordneten Typen konvertiert werden. Der Funktionsdelegate handle1 (Listing 4) wurde mit dem Typ Haskell definiert, die konkrete Methode erwartete allerdings nur den allgemeineren Typ Binary. Dieses Verhalten ist immer möglich, wenn es sich um einen Eingabeparameter (in-Parameter) handelt. Ausgabeparameter verhalten sich genau anders, also gemäß Covariance. Über einen generischen Funktionszeiger wird in Listing 5 eine Methode mit einem Ausgabe- und einem Parameterwert definiert. Der Ausgabewert ist vom Typ Binary und der Eingangswert vom Typ Functional. Beim Aufruf der Methode wird eine Instanz vom Typ Haskell übergeben. Da Haskell von der Klasse Functional abgeleitet wurde, handelt es sich um eine Subklasse. Diese Übergabe ist dank Contravariance legal und wird kompiliert. Am Ende gibt die Funktion eine neue Haskell-Instanz zurück, obwohl lediglich der Typ Binary bei der Definition des Funktionszeigers festgelegt wurde. Das entspricht dem Covariance-Verhalten und ist somit legal und wird ebenfalls kompiliert. Einfach ausgedrückt kann festgehalten werden, dass Eingangstypen automatisch auf allgemeinere Typen abgebildet werden. Ausgangsparameter hingegen können zunächst als allgemeinere Typen definiert werden, die konkreten Ausgangstypen können jedoch spezialisiertere Typen sein.

Listing 5

public static void CovarianceContravariance()
{
  Func TestMethod = (haskell) =>
  {
    Console.WriteLine("Running ...");
    return new Haskell();
  };
  Haskell test = (Haskell)TestMethod(new Haskell());            
}  

Zusammenfassung

Covariance und Contravariance spielen sich eher im Hintergrund ab. Dennoch ist es nicht verkehrt, die Funktionsweise zu verstehen, die in der nächsten Ausgabe des dot.NET Magazins genauer unter die Lupe genommen wird. Weiterhin werden dann auch die verschiedenen Umsetzungen in den vorhandenen .NET-Versionen thematisiert.

Marc André Zhou arbeitet als Senior Consultant bei der Logica Deutschland GmbH & Co. KG. Seine Schwerpunkte liegen im Bereich SharePoint, Softwarearchitekturen und Frameworks, hier hauptsächlich im .NET-Umfeld. Sie erreichen ihn unter marc.andre.zhou@logica.com.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -