Koncept (generisk programmering)

I generisk programmering är ett koncept en beskrivning av stödda operationer på en typ, inklusive syntax och semantik. På så sätt är begrepp relaterade till abstrakta typer men begrepp kräver inget undertypsförhållande.

Språkanvändning

Termen användes redan 1998 för STL , eftersom detta var ett av de första biblioteken som i stor utsträckning använde mallar. Termen koncept (och dess popularisering) krediteras Alexander Stepanov , den primära designern av STL.

I C++ 1998-standarden introducerades konceptet för att bara nämna en enkel beskrivning av kraven för en viss typ, vanligtvis en mallparameter . Det kodades inte explicit i språket – konceptet uttrycktes endast genom vilka operationer som försöks göra på objekt av den typen och vad som förväntas fungera (det vill säga att kompilera korrekt). Det fanns ett förslag att lägga till begrepp som en explicit språkfunktion i C++11 , även om det avvisades som "inte redo". C++20 accepterade så småningom den raffinerade designen av konceptet.

Eftersom generika i Java och C# har vissa likheter med C++s mallar , spelas begreppens roll där av gränssnitt . Det finns dock en viktig skillnad mellan koncept och gränssnitt: när en mallparameter krävs för att implementera ett visst gränssnitt, kan matchningstypen bara vara en klass som implementerar (explicit) det gränssnittet. Koncept ger mer flexibilitet eftersom de kan tillfredsställas på två sätt:

  • uttryckligen definieras som tillfredsställd genom att använda en konceptkarta (definierad separat för själva typen, till skillnad från gränssnitt)
  • implicit definierad för "autokoncept", som även kan användas för inbyggda typer och andra typer som inte var förutbestämda för denna användning

Men C#-språket har flera konstruktioner där den använda typen inte behöver explicit implementera ett definierat gränssnitt, det krävs bara att det matchar respektive mönster (däremot kallas dessa mönster inte koncept ) . Till exempel föreach iteration-satsen det itererade objektet att vara av vilken typ som helst, så länge det implementerar en lämplig GetEnumerator- metod. (Jämför med användningssatsen som kräver resursen för att implementera System.IDisposable -gränssnittet.)

Ett annat språk som implementerar något som liknar koncept är Haskell , där funktionen kallas typklasser .


Exempel

Total beställning

Begreppet Total ordering beskriver semantiken för operatorn < . En typ är helt ordnad när < är ett binärt predikat och uppfyller följande egenskaper:

  • antireflexiv: !(a < a) för valfritt värde a .
  • transitiv: Om a < b och b < c är a < c .
  • antisymmetrisk: Om a < b !(b < a) .
  • totalt: Om a != b a < b eller b < a .

Många algoritmer förlitar sig på att dessa egenskaper fungerar korrekt. Till exempel min -funktionen säkert definieras på Totally Ordered-typer:


  
     
    
        
        
      
       
        
    
 // kräver: T uppfyller Totally Ordered  mall  <  typnamn  T  >  T  min  (  Ta  ,  T  b  )  { // <   är  definierad.  if  (  b  <  a  )  {  return  b  ;  }  else  {  // !(b < a) antyder a == b eller a < b  returnerar  a  ;  }  } 

Iterator

Om en typ I uppfyller Trivial Iterator-konceptet i C++, och i är av typ I , är följande giltiga uttryck med motsvarande semantik:

  • Jag i standardkonstruktion.
  • *i måste kunna konverteras till någon typ T .
  • i->m är giltigt om (*i).m är.

Se även

externa länkar