Generische Daten/Algorithmen

Snape

Erfahrenes Mitglied
Tach,
das Brett hier dümpelt einigermaßen vor sich hin, dann frage ich doch selbst:

Was genau sind generische Algorithmen (gibt es auch generische Daten[typen]?), wie funktionieren sie und wofür sind sie gut, für welche Aufgaben werden sie verwendet?
 
Hallo!

Mit generischen Datentypen meinst du wohl Abstracte Datentypen (ADT's).
Schau mal hier:
http://www-a2.informatik.uni-hannover.de/~tby/SS02/ProgrammierenII/folien/Vorlesung09.2-1.BW.pdf

Hier mal ein Beispiel für die Implementierung eines Stacks in Java:
http://www.fh-wedel.de/~si/vorlesungen/java/OOP/AdtsInJava.html

Im Prinzip stellt das Collections API eine Basis von ADT's zu Verfügung um beliebige Elemente zu speichern.

Generische Algorithmen (Generisch heißt allgemein) funktionieren nach dem gleichen Prinzip für beliebige Objekte (na ja, zumindest für beliebige Inkarnationen eines bestimmten Typs)

Gruß Tom
 
Beispiele zum implementieren von generischen Algorithmen sind Beispielsweise
der Template Mechanismus in C++ oder es gibt wohl auch schon eine Möglichkeit
seit Java 5 generische Algorithmen zu definieren...
Sämtliche Algorithmen der Container Klassen der STL und der Collections seit Java 5 sind
generische Algorithmen...
Bsp:

Code:
#include <iostream>

using namespace std;

template<class T>
class TaschenRechner{

        public:
                T add(T zahl1, T zahl2){

                        return zahl1 + zahl2;
                }
};

int main(){
        
        TaschenRechner<int> tr;

        int res = tr.add(5,3);

        cout << res << endl;
}

Somit ist es nun möglich für sämtliche Objekte, vorrausgesetzt das für dasjenige Objekt der + Operator definiert ist.. (in dem Beispiel int) eine Addition mit Hilfe des Templates Taschenrechner durchzuführen...
Sorry für den C++ Code aber ich denkmal er ist nicht zu komplex um ihn nicht zu verstehen,
und er veranschaulicht den Mechanismus, vielleicht kann noch jemand ein Beispielcode in
Java geben...

Gruß

RedWing
 
Zuletzt bearbeitet:
RedWing hat gesagt.:
Code:
#include <iostream>

using namespace std;

template<class T>
class TaschenRechner{

        public:
                T add(T zahl1, T zahl2){

                        return zahl1 + zahl2;
                }
};

int main(){
        
        TaschenRechner<int> tr;

        int res = tr.add(5,3);

        cout << res << endl;
}

Somit ist es nun möglich für sämtliche Objekte, vorrausgesetzt das für dasjenige Objekt der + Operator definiert ist.. (in dem Beispiel int) eine Addition mit Hilfe des Templates Taschenrechner durchzuführen...
Sorry für den C++ Code aber ich denkmal er ist nicht zu komplex um ihn nicht zu verstehen,
und er veranschaulicht den Mechanismus, vielleicht kann noch jemand ein Beispielcode in
Java geben...

Gruß

RedWing

Ich versteh den Code nicht. Mag an der (m.E.) kranken Syntax liegen.
 
Tom hat gesagt.:
Java Generics funktionieren leider nur mit Referenz-Typen.

Schade und das war eigentlich der Punkt wieso das neue Java für mich so attraktiv war...
Also ist es prinzipiell nur möglich bei der Defnition eines Templates in Java Methoden
der Klasse Object zu verwenden? Wenns so ist hätten sie sich die Einführung des
Mechanismus zum Selberimplementieren auch gleich sparen können

Snape hat gesagt.:
Ich versteh den Code nicht. Mag an der (m.E.) kranken Syntax liegen.

Eigentlich ganz einfach, du kannst dir das T wie einen Platzhalter vorstellen, für
den dann zur Kompilierungszeit der Name des speziellen Typs eingesetzt wird...

Code:
template<class T>
class TaschenRechner

= Deklaration eines Templates( einer Schablone) Taschenrechner die somit für alle Typen T
deklariert wird...

Code:
T add(T zahl1, T zahl2){
   ...
  }

= Deklaration und Definition einer Methode add welche in der Schablone TaschenRechner
gekapselt ist, diese Methode add arbeitet somit auf allen Typen T für die TaschenRechner
deklariert ist...

Code:
TaschenRechner<int> tr;

Deklaration einer Variablen tr vom Typ Taschenrechner der somit für int Elemente definiert
wurde => die Methoden add vom Objekt tr arbeitet somit auf "int".
Das macht folgenden Aufruf möglich:

Code:
int res = tr.add(5,3);

Und das kannst du im Prinzip nicht nur für ints sondern für alle Typen (auch eigene) machen,
vorrausgesetzt der Operator + ist für einen solchen defniert...

Gruß

RedWing
 
//OT
Um die Eleganz der Sprache und des Mechanismuses zu zeigen ist vielleicht folgendes
Beispiel noch ganz nett, (wer was damit anfangen kann)

Code:
#include <iostream>

using namespace std;

template<class T>
class TaschenRechner{

        public:
                T add(T zahl1, T zahl2){

                        return zahl1 + zahl2;
                }
};

class Integer{

        public:
                int value;

                Integer(int value):value(value){}

                Integer operator+(Integer& zahl1){

                        return Integer(value + zahl1.value);
                }
        
                friend ostream& operator<<(ostream& cout, Integer zahl){ 
                     
                        cout << zahl.value;
                        return cout;
                }
};

int main(){
        
        TaschenRechner<Integer> tr;
        
        Integer res = tr.add(5,3);
        cout << res << endl;
}

@snape die Java Syntax unterscheidet sich im übrigen auch nicht großartig von der c++
Syntax:

http://java.sun.com/developer/technicalArticles/J2SE/generics/

Gruß

RedWing
 
Zuletzt bearbeitet:
Zurück