Kovariant returtyp
I objektorienterad programmering är en kovariansreturtyp av en metod en som kan ersättas av en "smalare" typ när metoden åsidosätts i en underklass. Ett anmärkningsvärt språk där detta är ett ganska vanligt paradigm är C++ .
C# stöder returtypskovarians från och med version 9.0. Kovarianta returtyper har varit (delvis) tillåtna i Java-språket sedan lanseringen av JDK5.0, så följande exempel skulle inte kompileras på en tidigare version:
// Klasser som används som returtyper: klass A { } klass B förlänger A { } // "Klass B är smalare än klass A" // Klasser som visar metodöverskridande: klass C { A getFoo () { return new A (); } } klass D utökar C { // Åsidosätter getFoo() i överordnad klass C B getFoo () { return new B (); } }
Mer specifikt hänvisar kovariant (bred till smalare) eller kontravariant (smal till bredare) returtyp till en situation där returtypen för den överordnade metoden ändras till en typ som är relaterad till (men skiljer sig från) returtypen för den ursprungliga åsidosatta metoden . Relationen mellan de två samvarianta avkastningstyperna är vanligtvis en som tillåter substitution av den ena typen med den andra, enligt Liskov-substitutionsprincipen . Detta innebär vanligtvis att returtyperna för de överordnade metoderna kommer att vara undertyper av returtypen för den åsidosatta metoden. Ovanstående exempel illustrerar specifikt ett sådant fall. Om substitution inte är tillåten är returtypen invariant och orsakar ett kompileringsfel.
Ett annat exempel på kovarians med hjälp av inbyggd objekt- och strängklass i Java:
class Parent { public Object getFoo () { return null ; } } class Child extends Parent { // String är barn till den större objektklassen public String getFoo () { return "This is a string" ; } // Driver code public static void main ( String [] args ) { Child child = new Child (); System . ut . println ( barn . getFoo ()); } }