i olika programmeringsspråk Generiska subrutiner i olika programmeringsspråk
Generiska subrutiner Subrutin vars parameter- och variabeltyper specificeras först när den anropas T.ex. är det möjligt att skapa en subrutin som både kan sortera vektorer och länkade listor (i C++)
Generiska subrutiner i Ada En viktig komponent för generisk programmering i Ada är generic unit I en sådan definieras ett slags mall för en subrutin med generiska parametrar som sedan byts ut mot datatyper när en instans av subrutinen skapas
Generiska subrutiner i Ada Ett exempel: generic type Item is private; -- generisk parameter procedure Swap(X,Y: in out Item); procedure Swap(X,Y: in out Item) is Temp: Item; begin Temp := X; X := Y; Y:= Temp; end Swap; -- instansiering av Swap där Item får datatypen Float: procedure Swap_Float is new Swap(Float);
Generiska subrutiner i C++ Kallas template och deklareras i formatet: template <class identifier> function_declaration; template <typename identifier> function_declaration; Det har ingen betydelse om class eller typename används
Generiska subrutiner i C++ Ett exempel: template<typename T> void Swap(T & a, T & b) { T temp = b; b = a; a = temp; } Funktionen tar emot variablerna a och b som referenser och skiftar värde på dem Kopior av programmet skapas vid kompilering för alla olika typer av T som används. I varje kopia byts T ut mot den aktuella datatypen, i exemplet ovan skulle t.ex. char eller string vara rimligt.
Generiska subrutiner i Java Har funnits i Java sedan J2SE 5.0 (2004) En klass-, interface-, metod- eller constructor-deklaration som består av en s.k. type variable får generiska egenskaper En type variable är en identifierare för ospecificerade variabler
Generiska subrutiner i Java Ett exempel på en generisk klass: public class Pair<T, S> { public Pair(T f, S s) first = f; second = s; } private T first; private S second; Klassen används sedan på följande sätt: Pair<String, String> grade440 = new Pair<String, String>("mike", "A"); Pair<String, Integer> marks440 = new Pair<String, Integer>("mike", 100);
Generiska subrutiner i Java En generisk subrutin som använder den föregående klassen: public <T> Pair<T,T> twice(T value) { return new Pair<T,T>(value,value); } och ett exempel på hur den används: Pair<String, String> pair = twice("Hello");
Generiska subrutinen i Java Till skillnad från i C++ genereras bara en version av funktionen även om flera olika datatyper används Funktionens korrekthet undersöks vid kompileringstillfället
Review questions What causes a C++ template function to be instantiated? För varje datatyp som funktionen anropas med skapar kompilatorn en instans vid anropet. Varje instans är en specialisering av funktionen som används överallt i programmet där samma parametrar används.
Review questions In what fundamental way do the generic parameters to a Java 5.0 generic method differ from those of C++ methods? I Java måste parametrarna vara klasser. I C++ kan de också vara primitiva typer (int, double o.s.v.)