120 likes | 256 Views
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.
E N D
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 genericunit • 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 typeItem is private; -- generisk parameter procedureSwap(X,Y: in outItem); 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: procedureSwap_Floatisnew Swap(Float);
Generiska subrutiner i C++ Kallas template och deklareras i formatet: • template <classidentifier> function_declaration; • template <typenameidentifier> function_declaration; Det har ingen betydelse om class eller typename används
Generiska subrutiner i C++ • Ett exempel: template<typename T> voidSwap(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; } • Klassenanvänds sedan påföljandesä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) { returnnew 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 • Whatcauses a C++ templatefunction 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 waydo the generic parameters to a Java 5.0 genericmethoddiffer 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.)