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  ());  }  } 

Se även

externa länkar