Post on 11-Jan-2016
description
Objektorientiertes Programmieren - Nils Schmeißer
1
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Einführung in das objektorientierte Programmieren
Nils SchmeißerNils Schmeißer
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Forschungszentrum Rossendorf e.V.Forschungszentrum Rossendorf e.V.
Objektorientiertes Programmieren - Nils Schmeißer
2
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Inhalt ProgrammiersprachenProgrammiersprachen Der objektorientierte ProgrammierstilDer objektorientierte Programmierstil
– Begriffsbestimmung, Theorie, AnwendungBegriffsbestimmung, Theorie, Anwendung OO SprachenOO Sprachen
C++ und Standardbibliotheken (STL, MFC)C++ und Standardbibliotheken (STL, MFC) Turbo-PASCAL, Java, Smalltalk, Eiffel, OberonTurbo-PASCAL, Java, Smalltalk, Eiffel, Oberon
andere OO Systemeandere OO Systeme
Objektorientiertes Programmieren - Nils Schmeißer
3
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Literatur– „„A Theory of Objects“A Theory of Objects“; M. Abadi, L. Cardelli; M. Abadi, L. Cardelli– „„Eiffel: The Language“Eiffel: The Language“; B. Meyer; B. Meyer– „„Programming in Oberon: Steps beyond Programming in Oberon: Steps beyond
Pascal and Modula“Pascal and Modula“; M. Reiser, N. Wirth; M. Reiser, N. Wirth– ““The C++ Programming Language”The C++ Programming Language”;;
B. StroustrupB. Stroustrup– „„Java - Die Programmiersprache“Java - Die Programmiersprache“;;
K. Arnold, J. GoslingK. Arnold, J. Gosling– „„Objektorientierte Datenbanken“Objektorientierte Datenbanken“; A. Heuer; A. Heuer
Objektorientiertes Programmieren - Nils Schmeißer
4
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Andere Quellen
Unterlagen zum OOP/C++-Kurs:Unterlagen zum OOP/C++-Kurs:http://www.fz-rossendorf.de/FVTK/MITARB/schmei/doc/CPP-Kurshttp://www.fz-rossendorf.de/FVTK/MITARB/schmei/doc/CPP-Kurs
Unterlagen zum C-Kurs:Unterlagen zum C-Kurs:http://www.fz-rossendorf.de/FVTK/MITARB/schmei/doc/C-Kurshttp://www.fz-rossendorf.de/FVTK/MITARB/schmei/doc/C-Kurs
Objektorientiertes Programmieren - Nils Schmeißer
5
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Geschichte der Programmierspr.
1955
1960
1970
1980
1985
1990
Assembler
FORTRAN
Algol68
Modula
Turbo-Pascal 5.5
Oberon
Ada
Ada95
Pascal
BC PL
C
C++
Simula
Java
Sketchpad
Smalltalk
Smalltalk 80
Eiffel
Objektorientiertes Programmieren - Nils Schmeißer
6
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Programmiersprachen imperative Sprachenimperative Sprachen
Ada, ALGOL, BASIC, C, COBOL, FORTRAN, Modula-2, Ada, ALGOL, BASIC, C, COBOL, FORTRAN, Modula-2, PL/1, Pascal, Simula, SnobolPL/1, Pascal, Simula, Snobol
funktionale und applikative Sprachenfunktionale und applikative Sprachen Lisp, LogoLisp, Logo
prädikative Sprachenprädikative Sprachen PrologProlog
objektorientierte Sprachenobjektorientierte Sprachen Smalltalk, Eiffel, Oberon, Java, Turbo-Pascal, C++, Smalltalk, Eiffel, Oberon, Java, Turbo-Pascal, C++,
Fortran2000Fortran2000
Objektorientiertes Programmieren - Nils Schmeißer
7
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
imperative Sprachen 1 ein Programm besteht aus einer Menge ein Programm besteht aus einer Menge
von von BefehlenBefehlen BASIC:BASIC: 1010 let n=...let n=...
2020 gosub 50gosub 503030 nf=nfaknf=nfak4040 endend5050 let nfak=1let nfak=16060 for i=1 to nfor i=1 to n7070 nfak=nfak*i nfak=nfak*i8080 next inext i9090 returnreturn
Objektorientiertes Programmieren - Nils Schmeißer
8
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
imperative Sprachen 2
prozedurale Sprachen gruppieren prozedurale Sprachen gruppieren Befehle in UnterprogrammenBefehle in Unterprogrammen
C:C: int fac(int n) {int fac(int n) { if (n==0) return 1; if (n==0) return 1; return n*fac(n-1); return n*fac(n-1);}}......nf=fac(n);nf=fac(n);
Objektorientiertes Programmieren - Nils Schmeißer
9
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
funktionale und applikative Sp. ein Programm besteht aus einer Menge von ein Programm besteht aus einer Menge von
Funktionen und deren AnwendungFunktionen und deren Anwendung Lisp:Lisp: (fac (n)(fac (n)
(cond (cond ((equal n 0) 1) ((equal n 0) 1)
(times n (fac (times n (fac (difference n 1) (difference n 1)
) ) ) ) ) )))......(fac n)(fac n)
Objektorientiertes Programmieren - Nils Schmeißer
10
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
prädikative Sprachen
in prädikativen Sprachen wird eine in prädikativen Sprachen wird eine Menge von Fakten und Regeln Menge von Fakten und Regeln vorgegebenvorgegeben
Prolog:Prolog: fac(0,1).fac(0,1).fac(n,f) -> fac(n-fac(n,f) -> fac(n-
1,f/n).1,f/n).
Objektorientiertes Programmieren - Nils Schmeißer
11
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
objektorientierte Sprachen 1
alle zum Lösen eines Problems nötigen alle zum Lösen eines Problems nötigen Informationen werden als Informationen werden als ObjekteObjekte aufgefaßtaufgefaßt
Objekte empfangen und versenden Objekte empfangen und versenden NachrichtenNachrichten
Integer a
value
*
Integer b
value
*
Integer a,b; a * bInteger a,b; a * b
Objektorientiertes Programmieren - Nils Schmeißer
12
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
objektorientierte Sprachen 2 Smalltalk:Smalltalk: Object subclass: #IntegerObject subclass: #Integer
instanceVariableNames: ’value’instanceVariableNames: ’value’facfac nfak:=Integer new. nfak:=Integer new. [0=value] [0=value] ifTrue: [ nfak set: 1. ] ifTrue: [ nfak set: 1. ] ifFalse: [ nfak set: ifFalse: [ nfak set: (((self minus: 1) fac: ) (((self minus: 1) fac: ) times: value ). ] times: value ). ] ^nfak. ^nfak.!!
n:=(Integer new) set: ...n:=(Integer new) set: ...n fac.n fac.
Objektorientiertes Programmieren - Nils Schmeißer
13
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Der objektorientierte P.-Stil
Basiskonzept (abstrakter Datentyp)Basiskonzept (abstrakter Datentyp) BegriffsbestimmungBegriffsbestimmung
Objekt, Klasse, Instanz, Attribut, MethodeObjekt, Klasse, Instanz, Attribut, Methode VererbungVererbung PolymorphiePolymorphie
OOD (object oriented development)OOD (object oriented development) Kriterien für OO SprachenKriterien für OO Sprachen
Objektorientiertes Programmieren - Nils Schmeißer
14
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
abstrakter Datentyp 1
das Basiskonzept der objektorientierten das Basiskonzept der objektorientierten Programmierung bildet der abstrakte Programmierung bildet der abstrakte Datentyp (ADT)Datentyp (ADT)
ein ADT wird definiert durch:ein ADT wird definiert durch: seinen Wertebereich (Sorte)seinen Wertebereich (Sorte) die, über dem Wertebereich erklärten die, über dem Wertebereich erklärten
OperationenOperationen eine Menge von Vorbedingungeneine Menge von Vorbedingungen eine Menge von Axiomeneine Menge von Axiomen
Objektorientiertes Programmieren - Nils Schmeißer
15
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
abstrakter Datentyp 2
eine Sorte kann formal als Struktur eine Sorte kann formal als Struktur dargestelltdargestellt
Beispiel:Beispiel: koordkoord==sortsort IntegerInteger x; x; IntegerInteger y; y;endend;;
bzw.bzw.koord=x:Integer+y:Integerkoord=x:Integer+y:Integer
KomponentenKomponenten
Objektorientiertes Programmieren - Nils Schmeißer
16
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
abstrakter Datentyp 3
einem ADT werden Operationen (die einem ADT werden Operationen (die nicht notwendig nur Operanden vom nicht notwendig nur Operanden vom Sortentyp enthalten) zugeordnetSortentyp enthalten) zugeordnet
Beispiel:Beispiel: vec=vec=ADTADT(koord)(koord) SetXSetX:(vec,Integer);:(vec,Integer); ++:(vec,vec)->vec;:(vec,vec)->vec; normnorm:(vec)->Integer;:(vec)->Integer;endend;;
Objektorientiertes Programmieren - Nils Schmeißer
17
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
abstrakter Datentyp 4
zur vollständigen Beschreibung eines zur vollständigen Beschreibung eines ADT’s gehören zusätzlichADT’s gehören zusätzlich
die Vorbedingungendie Vorbedingungen
prepre: x=0; y=0;: x=0; y=0;
eine Menge von Axiomen (Spezifikationen), dieeine Menge von Axiomen (Spezifikationen), diedas Verhalten der Operationen festlegendas Verhalten der Operationen festlegen
+ (vec a,vec b) =(x=a.x+b.x,y=a.y+b.y)+ (vec a,vec b) =(x=a.x+b.x,y=a.y+b.y)
Objektorientiertes Programmieren - Nils Schmeißer
18
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
abstrakter Datentyp 5 Beschreibung nach Meyer:Beschreibung nach Meyer:
TYPETYPE vec[koord]vec[koord]FUNCTIONSFUNCTIONS SetXSetX:: vec[koord] x Integer->vec[koord]vec[koord] x Integer->vec[koord]
++:: vec[koord] x vec[koord] -> vec[koord]vec[koord] x vec[koord] -> vec[koord]normnorm:: vec[koord] -> Integervec[koord] -> Integer
CONDITIONSCONDITIONSAXIOMSAXIOMS FOR ALL FOR ALL i:Integer,a,b,c:vec[koord]:i:Integer,a,b,c:vec[koord]:
SetXSetX(a,i) = a.x := i(a,i) = a.x := i++(a,b) = c: ( c.x:=a.x+b.x, (a,b) = c: ( c.x:=a.x+b.x, c.y:=a.y+b.y ) c.y:=a.y+b.y )normnorm(a) = max(a.x , a.y)(a) = max(a.x , a.y)
Objektorientiertes Programmieren - Nils Schmeißer
19
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
abstrakter Datentyp 6
abstrakte Datentypen werden als abstrakte Datentypen werden als KlassenKlassen implementiert implementiert
Beispiel:Beispiel:classclass vec vec isis Integer x,y; Integer x,y; vec vec ++ (vec a,vec b) (vec a,vec b) isis return vec(a.x+b.x,a.y+b.y); return vec(a.x+b.x,a.y+b.y); endend;;endend;;
Objektorientiertes Programmieren - Nils Schmeißer
20
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Begriffsbestimmung 1
ObjektObjekt: eigenständiges Individuum mit : eigenständiges Individuum mit
– charakteristischen Eigenschaftencharakteristischen Eigenschaften– einem inneren Zustandeinem inneren Zustand– AttributenAttributen– MethodenMethoden
Objektorientiertes Programmieren - Nils Schmeißer
21
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel „„Kreis“:Kreis“:
– charakteristische Eigenschaften:charakteristische Eigenschaften: alle Punkte des Kreises habe den gleichen alle Punkte des Kreises habe den gleichen
Abstand zum MittelpunktAbstand zum Mittelpunkt
– innerer Zustand:innerer Zustand: sichtbar/unsichtbarsichtbar/unsichtbar
– Attribute:Attribute: Position, Radius, FarbePosition, Radius, Farbe
– MethodenMethoden Darstellen (Zeichnen), VerschiebenDarstellen (Zeichnen), Verschieben
Objektorientiertes Programmieren - Nils Schmeißer
22
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Begriffsbestimmung 2
KlasseKlasse::ist die Vereinigung und formale ist die Vereinigung und formale Beschreibung aller Objekte mit gleichen Beschreibung aller Objekte mit gleichen EigenschaftenEigenschaften– Klassen können als Implementation Klassen können als Implementation
abstrakter Datentypen aufgefaßt werdenabstrakter Datentypen aufgefaßt werden– Klassen werden auch als “Objektfabriken” Klassen werden auch als “Objektfabriken”
bezeichnetbezeichnet
Objektorientiertes Programmieren - Nils Schmeißer
23
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel
class Kreisklasse is Punkt Mittelpunkt; Real Radius; Color Farbe; Kreis New(Punkt M0,Real R0,Color C0); Zeichnen(); Verschieben(Punkt NeuerMittelpunkt);end;
Objektorientiertes Programmieren - Nils Schmeißer
24
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Begriffsbestimmung 3
eine eine InstanzInstanz ist die konkrete ist die konkrete Realisierung eines Objektes einer Realisierung eines Objektes einer KlasseKlasse– eine Instanz ist genau ein Objekteine Instanz ist genau ein Objekt– Instanzen haben einen Gültigkeitsbereich Instanzen haben einen Gültigkeitsbereich
(Lebensbereich)(Lebensbereich)– Instanzen werden durch einen Instanzen werden durch einen KonstruktorKonstruktor
erzeugt und einen erzeugt und einen DestruktorDestruktor zerstört zerstört
Objektorientiertes Programmieren - Nils Schmeißer
25
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel
obwohl k1 und k2 die gleichen obwohl k1 und k2 die gleichen Attributwerte haben, sind es Attributwerte haben, sind es voneinander verschiedene Objektevoneinander verschiedene Objekte
programprogram p1 p1 isis Kreis Kreis k3k3==KreisklasseKreisklasse::New::New((4,5),3,Grün);((4,5),3,Grün); subprogram ps1 issubprogram ps1 is Kreis k1=Kreisklasse::New((1,2),3,Rot);Kreis k1=Kreisklasse::New((1,2),3,Rot); Kreis k2=Kreisklasse::New((1,2),3,Rot);Kreis k2=Kreisklasse::New((1,2),3,Rot); ...... end;end;......endend;;
Objektorientiertes Programmieren - Nils Schmeißer
26
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Begriffsbestimmung 4
AttributeAttribute sind die Variablen, die den sind die Variablen, die den inneren Zustand eines Objektes inneren Zustand eines Objektes beschreibenbeschreiben
Attribute korrespondieren in ihrer Attribute korrespondieren in ihrer Bedeutung mit den Sorten des Bedeutung mit den Sorten des abstrakten Datentypsabstrakten Datentyps
die zugehörige Klasse heißt die zugehörige Klasse heißt KomponentenklasseKomponentenklasse
Objektorientiertes Programmieren - Nils Schmeißer
27
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel
die Klasse „Punktklasse“ ist eine die Klasse „Punktklasse“ ist eine Komponentenklasse von „Kreisklasse“Komponentenklasse von „Kreisklasse“
classclass KreisklasseKreisklasse isis PunktPunkt Mittelpunkt; Mittelpunkt; Real Radius;Real Radius; ......endend;;
classclass PunktklassePunktklasse isis ......endend;;
Objektorientiertes Programmieren - Nils Schmeißer
28
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Begriffsbestimmung 5 MethodenMethoden sind die über einer Klasse sind die über einer Klasse
erklärten und ihr zugeordneten erklärten und ihr zugeordneten OperationenOperationen
zwei spezielle Methodenzwei spezielle Methoden– Konstruktor: generiert eine InstanzKonstruktor: generiert eine Instanz– Destruktor: zerstört eine InstanzDestruktor: zerstört eine Instanz
ein Methodenaufruf ist Teil einer ein Methodenaufruf ist Teil einer NachrichtNachricht, die an ein Objekt versandt , die an ein Objekt versandt wirdwird
Objektorientiertes Programmieren - Nils Schmeißer
29
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel
die gesamte, an k3 versendete die gesamte, an k3 versendete Nachricht lautet:Nachricht lautet:
k3: „Verschiebe (dich) nach (7,8)“k3: „Verschiebe (dich) nach (7,8)“
program p1 isprogram p1 is Kreis k3=Kreisklasse::New((4,5),3,Grün);Kreis k3=Kreisklasse::New((4,5),3,Grün); ...... k3 k3 .. VerschiebenVerschieben(((7,8)(7,8)) ;) ;end;end;
Objektorientiertes Programmieren - Nils Schmeißer
30
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 1
VererbungVererbung ist die Weitergabe von ist die Weitergabe von Eigenschaften (Attributen und Eigenschaften (Attributen und Methoden) einer Methoden) einer BasisklasseBasisklasse an eine an eine abgeleitete Klasseabgeleitete Klasse
die Weitergabe von Werten ist ebenfalls die Weitergabe von Werten ist ebenfalls möglich (möglich (KlonenKlonen))
Objektorientiertes Programmieren - Nils Schmeißer
31
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 2
Vererbung gibt es in verschiedenen Vererbung gibt es in verschiedenen Ausprägungen:Ausprägungen:
SpezialisierungSpezialisierung: Objektmenge der Unterklasse : Objektmenge der Unterklasse ist Teilmenge der Objektmenge der Oberklasseist Teilmenge der Objektmenge der Oberklasse
Is-a HierarchieIs-a Hierarchie: wie Spezialisierung: wie Spezialisierung TyphierarchieTyphierarchie: jedes Objekt des Untertyps : jedes Objekt des Untertyps
verhält sich wie ein Objekt des Obertypsverhält sich wie ein Objekt des Obertyps KlassenhierarchieKlassenhierarchie: Vererbung der : Vererbung der
ImplementationImplementation
Objektorientiertes Programmieren - Nils Schmeißer
32
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispielclassclass EllipsenklasseEllipsenklasse isis Punkt Mittelpunkt;Punkt Mittelpunkt; Real a,b;Real a,b; Ellipse New(Punkt M0,Real a0,Real b0);Ellipse New(Punkt M0,Real a0,Real b0); Verschieben(Punkt NeuerMittelpunkt);Verschieben(Punkt NeuerMittelpunkt);endend;;
subclasssubclass KreisklasseKreisklasse ofof EllipsenklasseEllipsenklasse isis Punkt Mittelpunkt;Punkt Mittelpunkt; Real a,b; // a=bReal a,b; // a=b Kreis New(Punkt M0,Real R0);Kreis New(Punkt M0,Real R0); Verschieben(Punkt NeuerMittelpunkt);Verschieben(Punkt NeuerMittelpunkt);endend;;
Objektorientiertes Programmieren - Nils Schmeißer
33
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 3
es wird ebenfalls zwischen einfacher es wird ebenfalls zwischen einfacher und mehrfacher Vererbung und mehrfacher Vererbung unterschiedenunterschieden
x x x
x x
BasisklasseBasisklasse Basisklasse2Basisklasse2Basisklasse1Basisklasse1
Objektorientiertes Programmieren - Nils Schmeißer
34
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 4 speziell auf die Weitergabe von speziell auf die Weitergabe von
Methoden bezogen istMethoden bezogen ist– ErsetzungErsetzung: das vollständige Überschreiben : das vollständige Überschreiben
einer Methodeeiner Methode– VerfeinerungVerfeinerung: die ererbte Methode wird : die ererbte Methode wird
innerhalb der neuen Methode gerufeninnerhalb der neuen Methode gerufen– DelegationDelegation: die Ausführung einer Methode : die Ausführung einer Methode
wird an ein Objekt der Oberklasse (Prototyp) wird an ein Objekt der Oberklasse (Prototyp) weitergereicht weitergereicht
Objektorientiertes Programmieren - Nils Schmeißer
35
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel Ellipsenklasse::Skalieren(Real fa,Real fb)isEllipsenklasse::Skalieren(Real fa,Real fb)is
a=a*fa; b=b*fb; end; a=a*fa; b=b*fb; end; ErsetzungErsetzung::
Kreisklasse::Skalieren(Real f) isKreisklasse::Skalieren(Real f) is a=a*f; b=b*f; end; a=a*f; b=b*f; end;
VerfeinerungVerfeinerung::Kreisklasse::Skalieren(Real f) isKreisklasse::Skalieren(Real f) is Ellipsenklasse::(f,1.0); b=b*f; Ellipsenklasse::(f,1.0); b=b*f;end;end;
DelegationDelegation::Kreisklasse::Skalieren(Real f) isKreisklasse::Skalieren(Real f) is Ellipsenklasse::(f,f); Ellipsenklasse::(f,f);end;end;
Objektorientiertes Programmieren - Nils Schmeißer
36
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 5
manchmal kann es sinnvoll sein, die manchmal kann es sinnvoll sein, die Erzeugung von Instanzen bestimmter Erzeugung von Instanzen bestimmter Klassen zu verbieten (Festlegung eines Klassen zu verbieten (Festlegung eines Konzeptes); solche Klassen werden Konzeptes); solche Klassen werden abstrakte (Basis-)Klassenabstrakte (Basis-)Klassen genannt genannt
Objektorientiertes Programmieren - Nils Schmeißer
37
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beziehungen zwischen Klassen 1
erbt eine Klasse B von einer Klasse A, erbt eine Klasse B von einer Klasse A, so heißt A so heißt A BasisklasseBasisklasse oder oder SuperklasseSuperklasse von B, B heißt von B, B heißt SubklasseSubklasse
B genügt der B genügt der is-a Relationis-a Relation (B is-a A) (B is-a A)
AABB
Objektorientiertes Programmieren - Nils Schmeißer
38
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beziehungen zwischen Klassen 2
besitzt eine Klasse A ein Attribut vom besitzt eine Klasse A ein Attribut vom Typ der Klasse C, so heißt C Typ der Klasse C, so heißt C Komponentenklasse von AKomponentenklasse von A
A genügt der A genügt der has-a Relationhas-a Relation (A has-a C) (A has-a C)
CCAA
Objektorientiertes Programmieren - Nils Schmeißer
39
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beziehungen zwischen Klassen 3
benutzt eine Klasse A eine Instanz der benutzt eine Klasse A eine Instanz der Klasse D, so genügt A derKlasse D, so genügt A deruse-a Relationuse-a Relation (A use-a D) (A use-a D)
die Relationen sind vererbbar, alsodie Relationen sind vererbbar, alsoB has-a C und B use-a DB has-a C und B use-a D
DDAA
Objektorientiertes Programmieren - Nils Schmeißer
40
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Polymorphie 1
die Methode die Methode SwitchUp() kann in vielen kann in vielen verschiedenen Formen auftreten, sie heißt verschiedenen Formen auftreten, sie heißt polymorphpolymorph
classclass Gear Gear isis SwitchUpSwitchUp() () isis ... ... endend;;endend;;subclasssubclass ManualGear ManualGear ofof Gear Gear isis SwitchUpSwitchUp() () isis ... ... endend;;endend;;subclasssubclass AutomaticGear AutomaticGear ofof Gear Gear isis SwitchUpSwitchUp() () isis ... ... endend;;endend;;
Objektorientiertes Programmieren - Nils Schmeißer
41
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Polymorphie 2
neben dem neben dem universellen universellen PolymorphismusPolymorphismus (vorhergehende Folie) (vorhergehende Folie) gibt es den gibt es den ad-hoc Polymorphismusad-hoc Polymorphismus
Integer Trunc(Integer x);Integer Trunc(Integer x);Integer Trunc(Real x);Integer Trunc(Real x);
ad-hoc P. basiert auf dem Konzept der ad-hoc P. basiert auf dem Konzept der impliziten Typkonversionimpliziten Typkonversion
Objektorientiertes Programmieren - Nils Schmeißer
42
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Polymorphie 3
das Konzept der Polymorphie erlaubt das Konzept der Polymorphie erlaubt somit unterschiedliche Sichtweisen auf somit unterschiedliche Sichtweisen auf ObjekteObjekte
Beispiel:Beispiel:– eine Instanz der Klasse eine Instanz der Klasse ManualGearManualGear ist ist
ebenfalls mit den Eigenschaften der Klasse ebenfalls mit den Eigenschaften der Klasse GearGear ausgestattet, kann also wie eine ausgestattet, kann also wie eine solche agierensolche agieren
Objektorientiertes Programmieren - Nils Schmeißer
43
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Polymorphie 4
eine Variable vom Typ einer eine Variable vom Typ einer Superklasse kann somit auch eine Superklasse kann somit auch eine Instanz vom Typ einer Subklasse Instanz vom Typ einer Subklasse aufnehmenaufnehmen
Beispiel:Beispiel: Gear g;Gear g;g=g=newnew ManualGear; ManualGear;
Objektorientiertes Programmieren - Nils Schmeißer
44
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bindung 1
der Bindungsmechanismus beschreibt, der Bindungsmechanismus beschreibt, wie eine Methode einer Klasse wie eine Methode einer Klasse aufgerufen wirdaufgerufen wird
verschiedene Bindungskonzepte verschiedene Bindungskonzepte erlauben eine effiziente Wiederver-erlauben eine effiziente Wiederver-wendung bzw. gemeinsame Nutzung wendung bzw. gemeinsame Nutzung von Code auf sehr elegante Art und von Code auf sehr elegante Art und WeiseWeise
Objektorientiertes Programmieren - Nils Schmeißer
45
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bindung 2 statische Bindungstatische Bindung::
– während der Übersetzung wird die während der Übersetzung wird die Klassenzugehörigkeit der Instanz bestimmt Klassenzugehörigkeit der Instanz bestimmt und daraus die zu rufende Methode ermitteltund daraus die zu rufende Methode ermittelt
Beispiel:Beispiel: ManualGearManualGear g= g=newnew ManualGear; ManualGear;g.SwitchUp();g.SwitchUp();
ruft die Methode der Klasse ruft die Methode der Klasse ManualGearManualGearGearGear g= g=newnew ManualGear; ManualGear;g.SwitchUp();g.SwitchUp();
die der Klasse die der Klasse GearGear
Objektorientiertes Programmieren - Nils Schmeißer
46
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bindung 3 dynamische (späte) Bindungdynamische (späte) Bindung::
– die Klassenzugehörigkeit der Instanz wird die Klassenzugehörigkeit der Instanz wird erst zur Laufzeit bestimmterst zur Laufzeit bestimmt
Beispiel:Beispiel: ManualGearManualGear g= g=newnew ManualGear; ManualGear;g.SwitchUp();g.SwitchUp();
ruft die Methode der Klasse ruft die Methode der Klasse ManualGearManualGearGearGear g= g=newnew ManualGear; ManualGear;g.SwitchUp();g.SwitchUp();
ruft ebenfallsruft ebenfalls die der Klasse Manualdie der Klasse ManualGearGear
Objektorientiertes Programmieren - Nils Schmeißer
47
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bindung 4 späte Bindung wird nicht von allen späte Bindung wird nicht von allen
Sprachen unterstütztSprachen unterstützt standardmäßig wird eine Methode standardmäßig wird eine Methode
statisch gebundenstatisch gebunden dynamisch zu bindende Methoden dynamisch zu bindende Methoden
werden durch ein spezielles werden durch ein spezielles Schlüsselwort (meist “virtual”) Schlüsselwort (meist “virtual”) gekennzeichnetgekennzeichnet
“virtuelle Methoden”“virtuelle Methoden”
Objektorientiertes Programmieren - Nils Schmeißer
48
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bindung 5classclass GearGear isis Init();Init(); virtualvirtual SwitchUp() SwitchUp() isis ... ... endend;;endend;;subclasssubclass ManualGearManualGear ofof GearGear isis Init();Init(); virtualvirtual SwitchUp() SwitchUp() isis ... ... endend;;endend;;
GearGear g = g = newnew ManualGearManualGear;;
g.Init();g.Init(); // Gear::Init // Gear::Initg.SwitchUp(); // ManualGear::SwitchUpg.SwitchUp(); // ManualGear::SwitchUp
Objektorientiertes Programmieren - Nils Schmeißer
49
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel 1
ein Verfahren zum Lösen von ein Verfahren zum Lösen von GleichungssystemenGleichungssystemen
A x = b A x = b
wird implementiertwird implementiert ist A dünn besetzt, so werden die nicht-0 ist A dünn besetzt, so werden die nicht-0
Elemente normalerweise als Liste abgelegt, um Elemente normalerweise als Liste abgelegt, um Speicherplatz zu sparenSpeicherplatz zu sparen der Löser müßte neu implementiert werden der Löser müßte neu implementiert werden
Objektorientiertes Programmieren - Nils Schmeißer
50
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel 2 die Neuimplementation ist nicht nötig, die Neuimplementation ist nicht nötig,
wenn der Löser überwenn der Löser überclassclass MatrixMatrix isis int n,m; int n,m; Datatype data[maxz][maxs]; Datatype data[maxz][maxs]; virtualvirtual real real GetGet(int z,int s);(int z,int s); virtualvirtual void void SetSet(int z,int s,real v); (int z,int s,real v); endend;;
erklärt wirderklärt wirdMatrix Matrix SolverSolver(Matrix A,Matrix b);(Matrix A,Matrix b);
Objektorientiertes Programmieren - Nils Schmeißer
51
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel 3Matrix Matrix SolverSolver(Matrix A,Matrix b) (Matrix A,Matrix b) isis int i,j,k;int i,j,k; real f;real f; Matrix x = new Matrix;Matrix x = new Matrix; for k = 0 to for k = 0 to A.nA.n do begin do begin if abs(A.Get(k,k))<eps then swap();if abs(A.Get(k,k))<eps then swap(); for i = k+1 to A.n do beginfor i = k+1 to A.n do begin f=A.Get(i,k)/A.Get(k,k);f=A.Get(i,k)/A.Get(k,k); forfor j = k+1 j = k+1 toto A.mA.m dodo A.Set(i,j,A.Get(i,j)-f*A.Get(k,j))A.Set(i,j,A.Get(i,j)-f*A.Get(k,j));; b.Set(i,b.Get(i)-f*b.Get(k));b.Set(i,b.Get(i)-f*b.Get(k)); end;end; end;end; … … return x;return x;end;end;
Objektorientiertes Programmieren - Nils Schmeißer
52
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel 4
eine dünn besetzte Matrix kann dann eine dünn besetzte Matrix kann dann z.B. alsz.B. als
subclasssubclass SparseMatrixSparseMatrix ofof MatrixMatrix isis int n,m; int n,m; Datalist data; Datalist data; virtualvirtual real real GetGet(int z,int s);(int z,int s); virtualvirtual void void SetSet(int z,int s,real v); (int z,int s,real v); endend;;
erklärt werdenerklärt werden
Objektorientiertes Programmieren - Nils Schmeißer
53
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel 5
der Löser kann auch dann auf der Löser kann auch dann auf SparseMatrix Objekte angewandt SparseMatrix Objekte angewandt werden, wenn sein Quelltext nicht werden, wenn sein Quelltext nicht verfügbar ist (Bibliothek)verfügbar ist (Bibliothek)
MatrixMatrix A = A = newnew SparseMatrixSparseMatrix;;Matrix b = new Matrix;Matrix b = new Matrix;Matrix x;Matrix x;......x=Solver(A,b);x=Solver(A,b);
Objektorientiertes Programmieren - Nils Schmeißer
54
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Zusammenfassung– abstrakter Datentypabstrakter Datentyp
Sorten, zugeordnete OperationenSorten, zugeordnete Operationen
– KlassenkonzeptKlassenkonzept Klasse, Instanz, ObjektKlasse, Instanz, Objekt
– VererbungVererbung einfach, mehrfacheinfach, mehrfach
– PolymorphiePolymorphie– BindungBindung
statische und späte Bindung, virtuelle Methodestatische und späte Bindung, virtuelle Methode
Objektorientiertes Programmieren - Nils Schmeißer
55
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Und warum das Ganze?
Programme sollen:Programme sollen:– sichersicher– saubersauber– wiederverwendbarwiederverwendbar– lesbarlesbar
– schnellschnell
seinsein
Objektorientiertes Programmieren - Nils Schmeißer
56
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Softwareentwurf 1
ModularisierungModularisierung nach Funktionen:nach Funktionen:
» Funktionensammlungen, BibliothekenFunktionensammlungen, Bibliotheken
nach Daten bzw. Objekten:nach Daten bzw. Objekten:» KlassenpoolKlassenpool
Top-down EntwurfTop-down Entwurf Anwendung abstrakte FunktionAnwendung abstrakte Funktion Zerlegung festgelegter SystementwurfZerlegung festgelegter Systementwurf
Objektorientiertes Programmieren - Nils Schmeißer
57
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Softwareentwurf 2 Object Oriented DesignObject Oriented Design
Identifiziere ObjekteIdentifiziere Objekte Beschreibe ObjekteBeschreibe Objekte Beziehungen und Gemeinsamkeiten zwischen Beziehungen und Gemeinsamkeiten zwischen
ObjektenObjekten KlassenbildungKlassenbildung Beziehungen zwischen KlassenBeziehungen zwischen Klassen KlassenhierarchieKlassenhierarchie MethodenimplementationMethodenimplementation Programm aus Objektbeschreibung Programm aus Objektbeschreibung
Objektorientiertes Programmieren - Nils Schmeißer
58
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Kriterien für OO-Sprachen 1
nach Meyernach Meyer Modularisierung nach ObjektenModularisierung nach Objekten Abstrakte DatentypenAbstrakte Datentypen Freispeicherverwaltung (! C++)Freispeicherverwaltung (! C++) Module, Klassen und StandardtypenModule, Klassen und Standardtypen VererbungVererbung Polymorphismus und dynamische BindungPolymorphismus und dynamische Bindung Mehrfachvererbung (! Smalltalk)Mehrfachvererbung (! Smalltalk)
Objektorientiertes Programmieren - Nils Schmeißer
59
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Kriterien für OO-Sprachen 2
nach Wegnernach Wegner ObjekteObjekte KlassenKlassen VererbungVererbung
Strenge TypisierungStrenge Typisierung Abstrakte DatentypenAbstrakte Datentypen NebenläufigkeitNebenläufigkeit PersistenzPersistenz
Objektorientiertes Programmieren - Nils Schmeißer
60
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
OO-Sprachen
““bedeutend”bedeutend”– Turbo-Pascal, DelphiTurbo-Pascal, Delphi, , C++C++, , JavaJava, ,
Smalltalk-80, Oberon-2, Eiffel, Ada 95Smalltalk-80, Oberon-2, Eiffel, Ada 95 weniger bedeutendweniger bedeutend
– CLOS, Modula-3, Objective-C, Python, CLOS, Modula-3, Objective-C, Python, Sather, Simula, Tcl/Tk, VBScript, Visual Sather, Simula, Tcl/Tk, VBScript, Visual Basic, Objective-PascalBasic, Objective-Pascal
Objektorientiertes Programmieren - Nils Schmeißer
61
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C++
Einführung in die Sprache undEinführung in die Sprache und
Nutzung der OO EigenschaftenNutzung der OO Eigenschaften
Objektorientiertes Programmieren - Nils Schmeißer
62
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C++
1980-87 von B. Stroustrup bei AT&T 1980-87 von B. Stroustrup bei AT&T entwickeltentwickelt
1989 ANSI Standard1989 ANSI Standard C++ ist ein „besseres C“C++ ist ein „besseres C“ C++ implementiert den gesamten C C++ implementiert den gesamten C
Sprachumfang +Sprachumfang + Klassen, Vererbung, späte BindungKlassen, Vererbung, späte Bindung
Objektorientiertes Programmieren - Nils Schmeißer
63
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Sprachbeschreibung für die nächsten Folien soll folgende für die nächsten Folien soll folgende
Notation gelten:Notation gelten: Schlüsselwörter Schlüsselwörter werden gelb dargestelltwerden gelb dargestellt MetavariableMetavariable, die beliebige andere syntaktische , die beliebige andere syntaktische
Strukturen verkörpern, werden kursiv gesetztStrukturen verkörpern, werden kursiv gesetzt in in [ ][ ] geklammerte Spracheinheiten sind geklammerte Spracheinheiten sind
optional zu verwendenoptional zu verwenden Code wird in Courier angegebenCode wird in Courier angegeben
Objektorientiertes Programmieren - Nils Schmeißer
64
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C Grundlagen 1 typisierte proz. imperative Sprachetypisierte proz. imperative Sprache alle Variablen und Funktionen müssen alle Variablen und Funktionen müssen
deklariert und definiert werdendeklariert und definiert werden– Deklarationen:Deklarationen:
vardecl ::= vardecl ::= [[ aspec aspec ] [] [ constconst ]] typename varname typename varname ;;aspec ::= aspec ::= externextern || staticstatic || registerregister
Standardtypen: int, float, double, charStandardtypen: int, float, double, char– Erweiterung: Erweiterung: [[ signedsigned || unsignedunsigned ] [] [ longlong ]] stdtype stdtype
Felder xFelder x[ ][ ], Referenzen , Referenzen **x;x;
Objektorientiertes Programmieren - Nils Schmeißer
65
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C Grundlagen 2
StrukturenStrukturenstrukt ::= strukt ::= structstruct {{ komp1 ... kompn komp1 ... kompn }} varname varname ;;
Beispiel:Beispiel: structstruct {{ int x,y; int x,y; int color; int color; }} pointpoint;;
pointpoint.x=5;.x=5;
InstanzInstanz
Objektorientiertes Programmieren - Nils Schmeißer
66
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C Grundlagen 3
TypdefinitionenTypdefinitionentypdef ::= typdef ::= typedeftypedef typedescr typename typedescr typename ;;
Beispiel:Beispiel:typedeftypedef struct { struct { struct struct PointPoint { { int x,y; int x,y; int x,y; int x,y;
int color; int color; int color; int color;} } PointPoint ;; };};
PointPoint p p;;
Objektorientiertes Programmieren - Nils Schmeißer
67
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C Grundlagen 4
SteuerstrukturenSteuerstrukturen– VerzweigungVerzweigung
verzw ::= verzw ::= ifif (( cond cond )) anw anw [[ elseelse anw anw ]]
– SchleifeSchleife
forloop ::= forloop ::= for (for ( zuw zuw ;; cond cond ;; iter iter )) anw anw awhile ::= awhile ::= dodo block block whilewhile (( cond cond ) ;) ; nwhile ::= nwhile ::= while (while ( cond cond )) anw anw
Objektorientiertes Programmieren - Nils Schmeißer
68
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C Grundlagen 5
ifif ((x>=0x>=0)) abs=x;abs=x; elseelse abs=-x;abs=-x;
forfor ((i=0;i<n;i++i=0;i<n;i++)) s=s+i;s=s+i;
dodo { { xn=x-f(x)/fp(x);xn=x-f(x)/fp(x); x=xn;x=xn;} } whilewhile ((abs(f(x))>0.2abs(f(x))>0.2));;
whilewhile ((locklock)) ;;
Objektorientiertes Programmieren - Nils Schmeißer
69
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C Grundlagen 6 FunktionsdefinitionenFunktionsdefinitionen
fdefdecl ::= aspec rettype fname fdefdecl ::= aspec rettype fname (( [[ arglist arglist ]] ) ;) ;fdef ::= rettype fname fdef ::= rettype fname (( [[ arglist arglist ]] )) block block
Beispiel:Beispiel:externextern int int factfact((int xint x););int int factfact((int xint x) {) { if (x==0) return 1; if (x==0) return 1; return x*fact(x-1); return x*fact(x-1);}}
– eine nicht-eine nicht-voidvoid Funktion muß Funktion muß immer immer einen einen Wert zurückgeben (Wert zurückgeben (returnreturn value value;;))
Objektorientiertes Programmieren - Nils Schmeißer
70
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C Grundlagen 7: Modulkonzept
#include <header.h>int main() {
return fct(3);}
int fct(int c) {return c;
}
int fct(int);
Header.h
Modul1.c Modul2.c
ApplikationApplikation
Objektorientiertes Programmieren - Nils Schmeißer
71
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C++ Spezifika
neue Operatorenneue Operatoren– newnew und und deletedelete
ad-hoc Polymorphismusad-hoc Polymorphismus– Funktions- und OperatorüberladungFunktions- und Operatorüberladung
KlassenKlassen TemplatesTemplates StreamsStreams
Objektorientiertes Programmieren - Nils Schmeißer
72
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
neue Operatoren in C++ 1
new new – allokiert die benötigte Menge Speicher für allokiert die benötigte Menge Speicher für
ein „Objekt“ vom angegebenen Typein „Objekt“ vom angegebenen Typ– konstruiert die angegebene Anzahl von konstruiert die angegebene Anzahl von
InstanzenInstanzen deletedelete
– zerstört die referenzierten Instanzenzerstört die referenzierten Instanzen– gibt einen reservierten Speicherbereich freigibt einen reservierten Speicherbereich frei
Objektorientiertes Programmieren - Nils Schmeißer
73
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
neue Operatoren in C++ 2
Beispiel:Beispiel:
int *int *xx;; int n,*int n,*feldfeld;;xx==newnew int; int; feldfeld==newnew int [n]; int [n];...... ......deletedelete xx;; deletedelete feldfeld;;
xx feldfeld
Objektorientiertes Programmieren - Nils Schmeißer
74
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
neue Operatoren in C++ 3
Problem:Problem:
int *x=new int;int *x=new int;......x=new int;x=new int;
xx
Objektorientiertes Programmieren - Nils Schmeißer
75
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispieltypedef struct {typedef struct { int n,m;int n,m; double **data;double **data;} Matrix;} Matrix;
Matrix NewMatrix(int n0,int m0) {Matrix NewMatrix(int n0,int m0) { Matrix Matrix MM;; M.nM.n=n0; =n0; M.mM.m=m0;=m0; M.dataM.data = = newnew double* [ double* [M.nM.n];]; for (int i=0;i<M.n;i++)for (int i=0;i<M.n;i++) M.data[i]M.data[i] = = newnew double [ double [M.mM.m];]; return M;return M;}}
Objektorientiertes Programmieren - Nils Schmeißer
76
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
ad-hoc Polymorphismus 1
Funktionen oder Operatoren, die sich Funktionen oder Operatoren, die sich nur durch ihre Semantik nur durch ihre Semantik (Definitionsbereich), nicht aber durch (Definitionsbereich), nicht aber durch ihre Syntax unterscheiden heißenihre Syntax unterscheiden heißenad-hoc polymorphad-hoc polymorph
Beispiel:Beispiel: int abs(int)int abs(int)double abs(double);double abs(double);
Objektorientiertes Programmieren - Nils Schmeißer
77
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Funktionsüberladung
eine vorhandene Funktion eine vorhandene Funktion
F:AF:A11xAxA22x…xAx…xAnn W WAA
wird durch eine neue Definitionwird durch eine neue Definition
F:BF:B11xBxB22x…xBx…xBmm W WBB
überladen (Aüberladen (A11xAxA22x…xAx…xAnn=B=B11xBxB22x…xBx…xBmm)) z.B.:z.B.: int sum(int a,int b);int sum(int a,int b);
double sum(double a,double b);double sum(double a,double b);
Objektorientiertes Programmieren - Nils Schmeißer
78
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
ad-hoc Polymorphismus 2
Typkonversion:Typkonversion: integral promotionintegral promotion: Aufzählungstypen können : Aufzählungstypen können
ohne Einschränkung ev. unter Informations-ohne Einschränkung ev. unter Informations-verlust ineinander konvertiert werdenverlust ineinander konvertiert werden
integral conversionintegral conversion: int unsigned type wird im : int unsigned type wird im 2er-Komplement das Bitmuster beibehalten2er-Komplement das Bitmuster beibehalten
float-doublefloat-double: ggf. unter Stellenverlust: ggf. unter Stellenverlust floating-integralfloating-integral: Streichung von : Streichung von
Nachkommastellen (Keine Rundung!)Nachkommastellen (Keine Rundung!)
Objektorientiertes Programmieren - Nils Schmeißer
79
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
ad-hoc Polymorphismus 3 existiert eine Funktion in mehr als einer existiert eine Funktion in mehr als einer
Form, so wird aus den Typen der Form, so wird aus den Typen der aktuellen Parameter der aktuellen Parameter der best matchbest match bestimmtbestimmtNiveauNiveau KonversionKonversion 11 exact match, einfache Konversionexact match, einfache Konversion 22 promotions, float-doublepromotions, float-double 33 Standard Konversionen, KlassenzeigerStandard Konversionen, Klassenzeiger
KlassenreferenzKlassenreferenz 44 Nutzerdefinierte KonversionNutzerdefinierte Konversion 55 ellipsis conversionellipsis conversion
Objektorientiertes Programmieren - Nils Schmeißer
80
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
ad-hoc Polymorphismus 4 Beispiel:Beispiel:
int round(int x);int round(int x);int round(float x);int round(float x);– round(4);round(4);
O.K. O.K. – round(1.2);round(1.2);
Konflikt, da 1.2 double Konstante und Konflikt, da 1.2 double Konstante und integral-integral-promotionpromotion und und float-doublefloat-double auf selbem Niveau auf selbem Niveau
– round((float)1.2);round((float)1.2); O.K.O.K.
Objektorientiertes Programmieren - Nils Schmeißer
81
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
ad-hoc Polymorphismus & ADT
definieren Sie Ihre Datenstrukturen als definieren Sie Ihre Datenstrukturen als neue Typenneue Typen
erklären Sie Ihre Algorithmen als erklären Sie Ihre Algorithmen als Funktionen über diesen DatentypenFunktionen über diesen Datentypen
Beispiel: verwenden SieBeispiel: verwenden Sietypedef double vec[3];typedef double vec[3];double norm(vec a);double norm(vec a);
anstattanstattdouble norm(double a[3]);double norm(double a[3]);
Objektorientiertes Programmieren - Nils Schmeißer
82
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Operatorüberladung 1 ähnlich zur Funktionsüberladung können ähnlich zur Funktionsüberladung können
prinzipiell alle Operatoren überladen prinzipiell alle Operatoren überladen werdenwerden
Einschränkungen:Einschränkungen: es können keine neuen Operatoren erklärt werdenes können keine neuen Operatoren erklärt werden die Syntax eines Operators kann nicht geändert die Syntax eines Operators kann nicht geändert
werdenwerden die Semantik bestehender Definitionen kann nicht die Semantik bestehender Definitionen kann nicht
geändert werdengeändert werden die Priorität bleibt erhaltendie Priorität bleibt erhalten
Objektorientiertes Programmieren - Nils Schmeißer
83
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Operatorüberladung 2 Syntax der Deklaration:Syntax der Deklaration:
rtype rtype operatoroperator opname opname ((atype1 atype1 [ [ ,, atype2 atype2 ]] ););
Beispiel:Beispiel:
VectorVector operator operator -- ( (Vector aVector a,,Vector bVector b););
Definition wie FunktionsdefinitionDefinition wie Funktionsdefinition Vector Vector operatoroperator -- ((Vector aVector a,,Vector bVector b)) {{
Vector c; ...Vector c; ... return c; return c;}}
Objektorientiertes Programmieren - Nils Schmeißer
84
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Operatorüberladung 3typedef struct {typedef struct { unsigned int dim;unsigned int dim; double x[10]; double x[10];} Vector;} Vector;
VectorVector operatoroperator -- ((VectorVector aa,,VectorVector b b) {) { if (if (a.dima.dim!=b.dim) error();!=b.dim) error(); for (int i=0;i<for (int i=0;i<a.dima.dim;i++);i++) c.x[i]=c.x[i]=a.x[i]a.x[i]-b.x[i];-b.x[i]; c.dim=a.dim; c.dim=a.dim; return c;return c;}}
main() {main() { Vector a={3,1,2,3},b={3,4,5,6};Vector a={3,1,2,3},b={3,4,5,6}; Vector c=a-b;Vector c=a-b;}}
Objektorientiertes Programmieren - Nils Schmeißer
85
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Operatorüberladung 4
überladen werden kann z.B. auch [], überladen werden kann z.B. auch [], allerding muß [] in diesem Fall direkt an allerding muß [] in diesem Fall direkt an den Datentyp gebunden werdenden Datentyp gebunden werden
typedef struct {typedef struct { ... ... double &operator [] (unsigned int i); double &operator [] (unsigned int i); ... ...} Vector;} Vector;
StrukturenStrukturen
Objektorientiertes Programmieren - Nils Schmeißer
86
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Strukturen 1 Strukturen lassen sich als “Vorstufe” Strukturen lassen sich als “Vorstufe”
zum abstrakten Datentyp interpretierenzum abstrakten Datentyp interpretieren Strukturen können Komponenten Strukturen können Komponenten
beliebigen Typs und Funktionen beliebigen Typs und Funktionen enthaltenenthalten
Beispiel:Beispiel: struct MyStruct {struct MyStruct { int x; int x; int Value(); int Value();};};
Objektorientiertes Programmieren - Nils Schmeißer
87
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Strukturen 2 eine, einer Struktur zugeordnete Funktion eine, einer Struktur zugeordnete Funktion
heißt heißt Member-functionMember-function Member-functions können nur über eine Member-functions können nur über eine
Variable des Typs, dem sie zugeordnet sind, Variable des Typs, dem sie zugeordnet sind, aufgerufen werdenaufgerufen werden
Beispiel: Beispiel: struct MyStruct m;struct MyStruct m;
Value(); Value(); unzulässigunzulässig m.Value();m.Value(); O.K.O.K.
Objektorientiertes Programmieren - Nils Schmeißer
88
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Strukturen 3
Member-functions müssen zusammen Member-functions müssen zusammen mit ihrer Struktur definiert werdenmit ihrer Struktur definiert werden
int MyStruct int MyStruct :::: Value() { return x; } Value() { return x; }
Komponenten derselben Struktur Komponenten derselben Struktur brauchen nicht qualifiziert zu werdenbrauchen nicht qualifiziert zu werden
Strukturen können nicht vererbenStrukturen können nicht vererben
Objektorientiertes Programmieren - Nils Schmeißer
89
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Array-Subscriptiontypedef struct {typedef struct { unsigned int dim;unsigned int dim; double double x[10]x[10];; double &operator [] (unsigned int i);double &operator [] (unsigned int i);} Vector;} Vector;
double double &&VectorVector::operator::operator [][] ((unsigned int iunsigned int i) {) { if ((i<0) || (dim<=i)) error();if ((i<0) || (dim<=i)) error(); returnreturn x[i]x[i];;}}......Vector a;Vector a;
a[0]=5.0;a[0]=5.0;printf(”%lf\n”,a[0]);printf(”%lf\n”,a[0]);
Objektorientiertes Programmieren - Nils Schmeißer
90
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Datenkapselung 1
die Komponenten einer Struktur sind die Komponenten einer Struktur sind generell von überall her zugänglichgenerell von überall her zugänglich
Beispiel:Beispiel: main() {main() { struct MyStruct m;struct MyStruct m;
...... printf(”%d\n”,m.x); printf(”%d\n”,m.x); printf(”%d\n”,m.Value());printf(”%d\n”,m.Value());}}
Objektorientiertes Programmieren - Nils Schmeißer
91
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Datenkapselung 2 um Daten zu schützen, können sie um Daten zu schützen, können sie
verborgen werden und sind dann nur verborgen werden und sind dann nur noch innerhalb von Member-functions noch innerhalb von Member-functions zugreifbarzugreifbar
Komponenten werden durch den Komponenten werden durch den Vorsatz des Schlüsselwortes Vorsatz des Schlüsselwortes privateprivate geschütztgeschützt
alle Komponenten nach alle Komponenten nach privateprivate sind sind geschütztgeschützt
Objektorientiertes Programmieren - Nils Schmeißer
92
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Datenkapselung 3 Beispiel: Beispiel: typedef structtypedef struct {{
private:private: int x; int x; int y;int y; public:public: int Value(); int Value(); void Set(int v);void Set(int v);} } MyStructMyStruct;;
void MyStruct::Set(int v) { x=v; }void MyStruct::Set(int v) { x=v; }
main() {main() { MyStructMyStruct m; m; m.x=1; // nicht zulässigm.x=1; // nicht zulässig m.y=1; // nicht zulässigm.y=1; // nicht zulässig m.Set(1); // O.K.m.Set(1); // O.K.}}
Objektorientiertes Programmieren - Nils Schmeißer
93
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassen
Klassendefinition und InstanzierungKlassendefinition und Instanzierung VererbungVererbung
– einfache und mehrfacheeinfache und mehrfache– virtuelle Basisklassenvirtuelle Basisklassen– abstrakte Basisklasseabstrakte Basisklasse
universeller Polymorhpismus, Bindunguniverseller Polymorhpismus, Bindung FriendsFriends
Objektorientiertes Programmieren - Nils Schmeißer
94
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinition 1
die Implementation abstrakter Datentypen die Implementation abstrakter Datentypen erfolgt in C++ als Klasseerfolgt in C++ als Klasse
classdef ::= classdef ::= classclass classname interface classname interface ;;interface ::= interface ::= {{ compdef compdef }}
die Klassendefinition ist eine Anweisung die Klassendefinition ist eine Anweisung und muß daher mit einem “und muß daher mit einem “;;” ” abgeschlossen werdenabgeschlossen werden
Objektorientiertes Programmieren - Nils Schmeißer
95
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinition 2 Beispiel:Beispiel: classclass AA { };{ };
Klassendeklaration:Klassendeklaration: classclass AA;; Attribute werden wie Komponenten einer Attribute werden wie Komponenten einer
Struktur erklärtStruktur erklärt Attribute sind nurAttribute sind nur
innerhalb der Klasseinnerhalb der Klassegültig (private), könnengültig (private), könnenaber öffentlich werdenaber öffentlich werden
classclass BB {{ int a1; int a1; A a2; A a2;};};
Objektorientiertes Programmieren - Nils Schmeißer
96
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinition 3
Methoden werden ebenfalls als Methoden werden ebenfalls als Komponenten erklärt (und damit dem Komponenten erklärt (und damit dem zugrundeliegenden ADT zugeordnet)zugrundeliegenden ADT zugeordnet)
Beispiel:Beispiel:classclass PointPoint {{ int x,y; int x,y; void SetX(int xn); void SetX(int xn); int GetX(); int GetX();};};
Objektorientiertes Programmieren - Nils Schmeißer
97
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinition 4
die Methoden werden in der die Methoden werden in der Klassendefinition nur erklärt Klassendefinition nur erklärt (Interfacedefinition)(Interfacedefinition)
die Definition der Methoden erfolgt die Definition der Methoden erfolgt getrennt in der Formgetrennt in der Form
mdef ::= rtype cname mdef ::= rtype cname :::: mname mname (( [[ args args ]] )) block block Beispiel:Beispiel:
int int PointPoint::::GetX() GetX() {{ return x; return x; }}
Objektorientiertes Programmieren - Nils Schmeißer
98
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinition 5 Konstruktor:Konstruktor:
ist eine spezielle Methode, die während der ist eine spezielle Methode, die während der InstanzierungInstanzierung (automatisch) aufgerufen wird (automatisch) aufgerufen wird
der Konstruktor trägt immer den Namen der der Konstruktor trägt immer den Namen der Klasse und hat keinen Rückgabewert (auch Klasse und hat keinen Rückgabewert (auch nicht void)nicht void)
classclass PointPoint {{ PointPoint();();};};
Objektorientiertes Programmieren - Nils Schmeißer
99
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinition 6
der Konstruktor kann polymorph seinder Konstruktor kann polymorph sein
classclass PointPoint {{ PointPoint();(); PointPoint(int x0,int y0);(int x0,int y0);};};
ein Konstruktor ohne Argumente heißt ein Konstruktor ohne Argumente heißt StandardkonstruktorStandardkonstruktor und sollte immer definiert und sollte immer definiert werdenwerden
Objektorientiertes Programmieren - Nils Schmeißer
100
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinition 7
Destruktor:Destruktor: der Destruktor wird während der Zerstörung einer der Destruktor wird während der Zerstörung einer
Instanz (automatisch) gerufenInstanz (automatisch) gerufen er trägt den Klassennamen mit einer er trägt den Klassennamen mit einer
vorangestellten Tilde “vorangestellten Tilde “~~””
classclass PointPoint {{ ~~PointPoint();(); ~~PointPoint(int x0,int y0);(int x0,int y0);};};
auch der Destruktor kann polymorph seinauch der Destruktor kann polymorph sein
Objektorientiertes Programmieren - Nils Schmeißer
101
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Instanzierung 1 statische Instanzierung:statische Instanzierung:
durch die Deklaration einer Instanzvariablen wird eine durch die Deklaration einer Instanzvariablen wird eine Instanz der Klasse generiertInstanz der Klasse generiert
PointPoint p p;;
Lebensbereich der Instanz ist der Gültigkeitsbereich Lebensbereich der Instanz ist der Gültigkeitsbereich der Instanzvariablender Instanzvariablen
Beispiel:Beispiel: {{ int x; int x; Point p; Point p; p.SetX(2); p.SetX(2);}}
GültigkeitsbereichGültigkeitsbereich
Objektorientiertes Programmieren - Nils Schmeißer
102
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Instanzierung 2
dynamische Instanzierung:dynamische Instanzierung: die Anwendung des Operators die Anwendung des Operators newnew auf eine auf eine
Klasse generiert eine Instanz dieser KlasseKlasse generiert eine Instanz dieser Klasse
PointPoint **pp;; p = p = newnew Point; Point;
die Instanz lebt bis zur expliziten Zerstörung die Instanz lebt bis zur expliziten Zerstörung durch Anwendung des durch Anwendung des deletedelete-Operators auf -Operators auf irgendeineirgendeine Referenz auf die Instanz Referenz auf die Instanz
PointPoint * *r = pr = p; delete; delete r r;;
Objektorientiertes Programmieren - Nils Schmeißer
103
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Instanzierung 3 soll ein anderer als der Standard-soll ein anderer als der Standard-
konstruktor verwendet werden, so wird konstruktor verwendet werden, so wird an die Instanzvariable ein Parameter-an die Instanzvariable ein Parameter-satz angehangensatz angehangen PointPoint p1(1,2); p1(1,2);
PointPoint *p2= *p2=newnew PointPoint(3,y);(3,y);
die Auswahl des Konstruktors erfolgt die Auswahl des Konstruktors erfolgt nach den Regeln des ad-hoc nach den Regeln des ad-hoc PolymorphismusPolymorphismus
Objektorientiertes Programmieren - Nils Schmeißer
104
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Datenkapselung 1
C++ kennt drei ZugriffklassenC++ kennt drei Zugriffklassen– public:public:
Zugriff von überall her Zugriff von überall her– protected:protected:
Zugriff nur in der Instanz und in Zugriff nur in der Instanz und in Instanzen abgeleiteter Klassen Instanzen abgeleiteter Klassen
– private:private: Zugriff nur in der Instanz Zugriff nur in der Instanz
Objektorientiertes Programmieren - Nils Schmeißer
105
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Datenkapselung 2class A {class A { int a;int a; private:private: int b;int b; protected:protected: int c;int c; public:public: int d;int d; int e;int e; private:private: int f;int f; int M();int M();};};
int A::M() {int A::M() { f=1;f=1; c=2; c=2; e=3;e=3;}}
A m;A m;m.a=-1;m.a=-1;m.b=-2; m.b=-2; m.c=-3;m.c=-3;m.d=-4;m.d=-4;m.e=-5;m.e=-5;m.f=-6;m.f=-6;m.M();m.M();
innerhalb der Klasseinnerhalb der Klasseinnerhalb der Klasseinnerhalb der Klasseinnerhalb der Klasseinnerhalb der Klasse
privat (default)privat (default)privatprivatprotectedprotectedO.K.O.K.O.K.O.K.privatprivatprivatprivat
Objektorientiertes Programmieren - Nils Schmeißer
106
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
kurzer Rückblick
KlassendefinitionKlassendefinition– classclass AA { t { tii a aii; t; tjj m mjj; ... };; ... };ttjj AA::::mmjj(...) { ... }(...) { ... }
InstanzierungInstanzierung– statisch:statisch: A a;A a;
– dynamisch:dynamisch:A *b; b=A *b; b=newnew A(...); A(...); deletedelete b; b;
DatenkapselungDatenkapselung– privateprivate, , protectedprotected, , publicpublic
Objektorientiertes Programmieren - Nils Schmeißer
107
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 1
Klassen können voneinander abgeleitet Klassen können voneinander abgeleitet werdenwerden
classclass A { … }; A { … };classclass B B :: A { … }; A { … };
eine abgeleitete Klasseeine abgeleitete Klasseübernimmt alle Attribute und Methoden übernimmt alle Attribute und Methoden den Basisklasseden Basisklasse
AA
BB
Objektorientiertes Programmieren - Nils Schmeißer
108
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 2 Beispiel:Beispiel: classclass PointPoint {{
int x,y; int x,y; Point(int x0int y0); Point(int x0int y0); void Draw(); void Draw(); void MoveTo(int x1,int y1); void MoveTo(int x1,int y1); ~Point(); ~Point();};};
classclass CircleCircle :: PointPoint {{ int r; int r; Circle(int x0,int y0,int r0); Circle(int x0,int y0,int r0); void Draw(); void Draw(); ~Circle(); ~Circle();};};
Objektorientiertes Programmieren - Nils Schmeißer
109
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 3 C++ kennt mehrfache VererbungC++ kennt mehrfache Vererbung
class A {class A { int x;int x; A();A();};};class B {class B { int z;int z; B();B();};};classclass CC:: AA,,BB { { C();C();};};
AA
CC
BB
Objektorientiertes Programmieren - Nils Schmeißer
110
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 4
Namenskonflikte werden durch Namenskonflikte werden durch vollständige Qualifizierung aufgelöstvollständige Qualifizierung aufgelöst
class A { int x; };class A { int x; };class B { int x; };class B { int x; };class C: A,B {class C: A,B { int sum() { return int sum() { return A::xA::x++B::xB::x; }; }};};
Objektorientiertes Programmieren - Nils Schmeißer
111
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 5
virtuelle Basisklassenvirtuelle Basisklassen
class A {};class A {};class B:A {};class B:A {};class C:A {};class C:A {};class D:B,C { };class D:B,C { };
class A {};class A {};class B:class B:virtualvirtual A {}; A {};class C:class C:virtualvirtual A {}; A {};class D:B,C { };class D:B,C { };
AA AA
AA
BB
CC
DD
AA
BB
CC
DD
BB CC
DD
Objektorientiertes Programmieren - Nils Schmeißer
112
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 6
abstrakte Basisklasseabstrakte Basisklasseclass A {class A { void m1() void m1()=0=0; // abstrakte Methode; // abstrakte Methode void m2() { … }; // konkrete Methode void m2() { … }; // konkrete Methode};};
A kann nicht instanziert werdenA kann nicht instanziert werdenclass B:A {class B:A { void m1() { … }; // Konkretisierung m1 void m1() { … }; // Konkretisierung m1};};… B b;… B b;
Objektorientiertes Programmieren - Nils Schmeißer
113
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispielclass Gear {class Gear { unsigned int gear;unsigned int gear; public:public: void SwitchUp()void SwitchUp()=0=0;;};};
class ManualGear:Gear {class ManualGear:Gear { public:public: void SwitchUp();void SwitchUp();}}
void ManualGear::SwitchUp() { ... }void ManualGear::SwitchUp() { ... }
Objektorientiertes Programmieren - Nils Schmeißer
114
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung und Datenkapselung 1 die Weitergabe von Eigenschaften kann die Weitergabe von Eigenschaften kann
beschränkt erfolgenbeschränkt erfolgenclassclass ZZ : : AA, , publicpublic BB , , protectedprotected CC , , privateprivate DD { { … …};};
public: die Zugriffsbeschränkungen der Elternklasse public: die Zugriffsbeschränkungen der Elternklasse werden übernommenwerden übernommen
protected: public protectedprotected: public protected private: public, protected privateprivate: public, protected private
Objektorientiertes Programmieren - Nils Schmeißer
115
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung und Datenkapselung 2class A {class A { public: int x;public: int x; A();A();};};class B {class B { protected: int z;protected: int z; public: B();public: B();};};class C: protected A, public B {class C: protected A, public B { C();C();};};C c;C c;c.x = 1;c.x = 1; // falsch, x ist protected// falsch, x ist protectedc.A();c.A(); // falsch, A() ist protected// falsch, A() ist protectedc.z = 1;c.z = 1; // falsch, z ist protected// falsch, z ist protectedc.B();c.B(); // O.K.// O.K.
Objektorientiertes Programmieren - Nils Schmeißer
116
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bindung 1
Komponenten werden in C++ standard-Komponenten werden in C++ standard-mäßig statisch gebundenmäßig statisch gebunden
soll eine Methode dynamisch gebunden soll eine Methode dynamisch gebunden werden, so muß dies durch das werden, so muß dies durch das Schlüsselwort ”Schlüsselwort ”virtualvirtual” kenntlich ” kenntlich gemacht werdengemacht werden
wird eine virtuelle Methode wird eine virtuelle Methode überschrieben, so bleibt sie virtuellüberschrieben, so bleibt sie virtuell
Objektorientiertes Programmieren - Nils Schmeißer
117
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bindung 2classclass GearGear {{ public:public: virtualvirtual void SwitchUp()=0; void SwitchUp()=0; void SwitchDown();void SwitchDown(); ~Gear();~Gear();};};classclass ManualGearManualGear :: publicpublic GearGear {{ public:public: virtualvirtual void SwitchUp(); void SwitchUp(); void SwitchDown();void SwitchDown(); ~Gear();~Gear();};};
Gear *g = new ManualGear();Gear *g = new ManualGear();g->SwitchUp();g->SwitchUp(); // ManualGear::SwitchUp// ManualGear::SwitchUpg->SwitchDown();g->SwitchDown(); // Gear::SwitchDown// Gear::SwitchDown
Objektorientiertes Programmieren - Nils Schmeißer
118
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bindung 3
Frage: Welcher Destruktor wird im Frage: Welcher Destruktor wird im vorhergegangenen Beispiel gerufen, vorhergegangenen Beispiel gerufen, wennwenn
delete g;delete g;
aufgerufen wird und warum?aufgerufen wird und warum?
Objektorientiertes Programmieren - Nils Schmeißer
119
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bindung 4
da der Destruktor zunächst nicht da der Destruktor zunächst nicht dynamisch gebunden wird, wird ~Gear() dynamisch gebunden wird, wird ~Gear() gerufen - das ist falsch!gerufen - das ist falsch! virtueller Destruktor virtueller Destruktor
class Gear { ... class Gear { ... virtualvirtual ~Gear(); ~Gear();
}; };class ManualGear { ...class ManualGear { ... virtualvirtual ~ManualGear(); ~ManualGear();};};
Objektorientiertes Programmieren - Nils Schmeißer
120
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bindung 5 - VMT
die dynamische Bindung wird über eine die dynamische Bindung wird über eine sogenannte VMT - Virtual Method Table sogenannte VMT - Virtual Method Table organisiertorganisiert
attrattr
attrattr
A *b = new B;A *b = new B;VMT B:AVMT B:A
stat.stat.
virtuelle M.virtuelle M.
stat.stat.
VMTVMT VMTVMT==virt.virt. virt.virt.==
Objektorientiertes Programmieren - Nils Schmeißer
121
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel 1
classclass CarCar { { Gear *gear;Gear *gear; Engine *engine;Engine *engine; public:public: Car(Engine *e,Gear *g);Car(Engine *e,Gear *g); virtualvirtual void Accel(double) void Accel(double)=0=0;;};};Car::Car(Engine *e,Gear *g) {Car::Car(Engine *e,Gear *g) { engine=e;engine=e; gear=g;gear=g;}}
Objektorientiertes Programmieren - Nils Schmeißer
122
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispiel 2classclass Renault_R19Renault_R19:public:public CarCar { { public:public: Renault_R19(Engine *e,Gear *g);Renault_R19(Engine *e,Gear *g); virtualvirtual void void AccelAccel(double);(double);};};Renault_R19Renault_R19::::Renault_R19Renault_R19((Engine *e,Gear *g)((Engine *e,Gear *g) ::CarCar(e,g) { }(e,g) { }void void Renault_R19Renault_R19::::AccelAccel(double v) {(double v) { ...... if (engine->RPM()>3000) gear->SwitchUp();if (engine->RPM()>3000) gear->SwitchUp(); ......}} Car *my_car=new Renault_R19(Car *my_car=new Renault_R19( new GasolineEngine(2.5),new GasolineEngine(2.5), new ManualGear(5)); new ManualGear(5));
Objektorientiertes Programmieren - Nils Schmeißer
123
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
static Members 1 ein static Member existiert nur ein einziges ein static Member existiert nur ein einziges
mal für alle Instanzenmal für alle Instanzenclass A {class A { int x; int x; staticstatic int y; int y; staticstatic void m1(); void m1(); void m2(); void m2(); virtual void m3(); virtual void m3();};};
A a,b;A a,b;
kein thiskein this
aa bbAAxxa.xa.x b.xb.xA.yA.y
VMTVMT VMTVMTVMTVMT
m3m3
m1m1m2m2 m2m2 m2m2
Objektorientiertes Programmieren - Nils Schmeißer
124
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
static Members 2
ein static Attribut muß extra erklärt ein static Attribut muß extra erklärt werdenwerden
class A {class A { static int i; static int i;};};
int A::i;int A::i;
Objektorientiertes Programmieren - Nils Schmeißer
125
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Friends 1 BeispielBeispiel
class Matrix {class Matrix { Matrix operator * (Matrix&); Matrix operator * (Matrix&);};};class Vector {class Vector { double operator * (Vector&); double operator * (Vector&);};};
Wie sollte Matrix * Vector erklärt werden Wie sollte Matrix * Vector erklärt werden damit * effizient arbeitet?damit * effizient arbeitet?
Objektorientiertes Programmieren - Nils Schmeißer
126
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Friends 2 1. Variante:1. Variante:
class Matrix {class Matrix { Matrix operator * (Vector&); Matrix operator * (Vector&);};};
– hängt von der Implementation von Matrix ab (muß hängt von der Implementation von Matrix ab (muß also jedesmal neu erklärt werden)also jedesmal neu erklärt werden)
2. Variante2. Varianteclass Matrix {class Matrix { friendfriend Matrix operator*(Matrix&,Vector&); Matrix operator*(Matrix&,Vector&);};};
Objektorientiertes Programmieren - Nils Schmeißer
127
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Friends 3 die Implementation als friend gilt als Hinweis die Implementation als friend gilt als Hinweis
darauf, daß die Klasse verändert werden darauf, daß die Klasse verändert werden kannkann
ein friend ist quasi Member einer Klasse und ein friend ist quasi Member einer Klasse und hat Zugriff auf alle Komponenten der Klassehat Zugriff auf alle Komponenten der Klasseclass Matrix {class Matrix { friendfriend Matrix Matrix operatoroperator ** (Matrix&,Vector&); (Matrix&,Vector&);};};class Vector {class Vector { friendfriend Matrix Matrix operatoroperator ** (Matrix&,Vector&); (Matrix&,Vector&);};};
Objektorientiertes Programmieren - Nils Schmeißer
128
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Zusammenfasung - Klassen
Klassendefinition und InstanzierungKlassendefinition und Instanzierung VererbungVererbung
– einfache und mehrfacheeinfache und mehrfache– DatenkapselungDatenkapselung– virtuelle und abstrakte Basisklassenvirtuelle und abstrakte Basisklassen
universeller Polymorphismus, Bindunguniverseller Polymorphismus, Bindung FriendsFriends
Objektorientiertes Programmieren - Nils Schmeißer
129
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Templates 1
Templates stellen die Realisierung des Templates stellen die Realisierung des parametrischen Typkonzeptes darparametrischen Typkonzeptes dar
Motivation:Motivation: Verfahren können für einen abstrakten Typ T Verfahren können für einen abstrakten Typ T
erklärt werden, ohne das der Typ bekannt isterklärt werden, ohne das der Typ bekannt ist die Konkretisierung des Typs erfolgt erst bei die Konkretisierung des Typs erfolgt erst bei
der Nutzung des Verfahrensder Nutzung des Verfahrens
Beispiel: das Konzept des VektorsBeispiel: das Konzept des Vektors
Objektorientiertes Programmieren - Nils Schmeißer
130
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Templates 2– ein Vektor wird über einem Körper (T) erklärtein Vektor wird über einem Körper (T) erklärttemplate<template<classclass TT>> class class VectorVector {{ T T *v;*v; unsigned int dim; unsigned int dim; public: public: Vector(unsigned int s) { Vector(unsigned int s) { if (s==0) error(“dimension must not be 0“); if (s==0) error(“dimension must not be 0“); v=new T[dim=s]; v=new T[dim=s]; } } T T &operator [] (unsigned int i) {&operator [] (unsigned int i) { return v[i]; return v[i]; } } unsigned int Dim() { return dim; } unsigned int Dim() { return dim; }};};
Objektorientiertes Programmieren - Nils Schmeißer
131
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Templates 3
Nutzung:Nutzung:
void f() {void f() { Vector<Vector<intint>> v1(100); // 100 integer v1(100); // 100 integer // Elemente // Elemente Vector<Vector<Gear*Gear*>> g(10); // 10 Referenzen auf g(10); // 10 Referenzen auf
// // GetriebeinstanzenGetriebeinstanzen ... ... g[5]->SwitchUp(); g[5]->SwitchUp(); // schalte G. 5 // schalte G. 5}}
Objektorientiertes Programmieren - Nils Schmeißer
132
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Templates 4 Member-functions von Templates müssen nicht Member-functions von Templates müssen nicht
inline erklärt werdeninline erklärt werdentemplate<template<class Xclass X>> class class YY { { XX x; x; public: void method( public: void method(XX x0); x0);};};
die externe Definition erfolgt mit voller die externe Definition erfolgt mit voller Qualifikation:Qualifikation:template<template<class Xclass X>> void void YY<<XX>::>::method(method(XX x0) x0) {{ x=x0; x=x0;
}}
Objektorientiertes Programmieren - Nils Schmeißer
133
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Templates 5
der Quelltext der Implementation von der Quelltext der Implementation von nicht-inline Methoden von Templates nicht-inline Methoden von Templates muß nicht vorliegen,muß nicht vorliegen,damit können quasi abstrakte damit können quasi abstrakte Bibliotheken geschaffen werdenBibliotheken geschaffen werden
Objektorientiertes Programmieren - Nils Schmeißer
134
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Templates und Vererbung
Template Klassen können vererben:Template Klassen können vererben:template<template<class Tclass T>> ListList { T *elements; }; { T *elements; };template<template<class Tclass T>> OrderedListOrderedList::public public ListList<<TT>> { {}}
class A;class A;template<template<class Tclass T>> Based_on_A Based_on_A :: A { }; A { };
Templates können auf verschiedenen Templates können auf verschiedenen Typen basieren:Typen basieren:
template<template<class Aclass A,,class Bclass B,,class Listclass List<<AA>>>> CC {...}; {...};
Objektorientiertes Programmieren - Nils Schmeißer
135
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Templates und Argumente Templates können Argumente erhalten:Templates können Argumente erhalten:
template<template<class T,class T,unsigned int sunsigned int s>> class Array { class Array { T data[ T data[ss];];};};
Templates können sogar parametrisch Templates können sogar parametrisch erbenerbentemplate<template<class T,class T,class Aclass A>> class class ParamContainerParamContainer::public Container<T>, publicpublic Container<T>, public A A { { ... ... };};
Objektorientiertes Programmieren - Nils Schmeißer
136
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Funktions Templates 1
Grundidee:Grundidee: ein Funktionstemplate definiert eine Familie ein Funktionstemplate definiert eine Familie
von Funktionenvon Funktionen
Beispiel:Beispiel:
template<template<class Tclass T>> void void sortsort(Vector(Vector<<TT>>&);&);void f(Vector<int> &vi,Vector<float> &vf) {void f(Vector<int> &vi,Vector<float> &vf) { sort(vi); sort(vi); sort(vf); sort(vf);}}
Objektorientiertes Programmieren - Nils Schmeißer
137
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Funktions Templates 2
Implementation:Implementation:template<template<class Tclass T>> void void sortsort(Vector<T> &v) {(Vector<T> &v) { unsigned int n=v.size(); unsigned int n=v.size(); for (int i=0;i<n-1;i++) for (int i=0;i<n-1;i++) for (int j=n-1;i<j;j--) for (int j=n-1;i<j;j--) if ( if (v[j]<v[j-1]v[j]<v[j-1]) {) { T temp=v[j];T temp=v[j]; v[j]=v[j-1]; v[j]=v[j-1]; v[j-1]=temp; v[j-1]=temp; } }}}
Objektorientiertes Programmieren - Nils Schmeißer
138
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Funktionstemplates 3– Co-Existenz von Templates und SpezialisierungenCo-Existenz von Templates und Spezialisierungen
template<class T> class Comp { template<class T> class Comp { public: public: static int comp(T &a,T &b) { return a<b; } static int comp(T &a,T &b) { return a<b; } }; };
class Comp<char*> { class Comp<char*> { public: public: static int comp(const char *a,const char *b) static int comp(const char *a,const char *b) { return strcmp(a,b); } { return strcmp(a,b); } }; };
template<class T> class SortableVector template<class T> class SortableVector :public Vector<T>,public Comp<T> { :public Vector<T>,public Comp<T> { ... ... }; };
Objektorientiertes Programmieren - Nils Schmeißer
139
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Funktionstemplates 4 Operationen als Template-ArgumenteOperationen als Template-Argumente
template<class T,class Comp> class Sort { template<class T,class Comp> class Sort { public void sort(vector<T>&); public void sort(vector<T>&); }; };
template<class T,class Comp> template<class T,class Comp> void Sort<T,Comp>::sort(Vector<T> &v) { void Sort<T,Comp>::sort(Vector<T> &v) { ... ... if (Comp::comp(v[j],v[j-1])) if (Comp::comp(v[j],v[j-1])) ... ... } }
template<class T> class LT:public Comp<T>; template<class T> class LT:public Comp<T>; template<class T> class GT:public Comp<T>; template<class T> class GT:public Comp<T>; Sort< int, LT<int> >::sort(vi); Sort< int, LT<int> >::sort(vi);
Sort< int, GT<int> >::sort(vi); Sort< int, GT<int> >::sort(vi);
Objektorientiertes Programmieren - Nils Schmeißer
140
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Standard Template Library
ist eine Template Sammlung von SGI ist eine Template Sammlung von SGI (http://www.sgi.com/Technology/STL)(http://www.sgi.com/Technology/STL)
die folgende Kategorien abdecktdie folgende Kategorien abdeckt ContainerContainer IteratorenIteratoren AlgorithmenAlgorithmen FunktionsobjekteFunktionsobjekte „„Utilities“Utilities“ SpeicherverwaltungSpeicherverwaltung
Objektorientiertes Programmieren - Nils Schmeißer
141
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
STL - Container
– KonzepteKonzepte allgemeine, Folgen, assoziative Conatinerallgemeine, Folgen, assoziative Conatiner
– ContainerklassenContainerklassen Folgen: vector, deque, list, slist, bit_vectorFolgen: vector, deque, list, slist, bit_vector assoziative Container: set, map, hashassoziative Container: set, map, hash Stringpacket: char_traits, basic_stringStringpacket: char_traits, basic_string roperope Adaptoren: stack, queueAdaptoren: stack, queue
Objektorientiertes Programmieren - Nils Schmeißer
142
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
STL - Iteratoren– KonzepteKonzepte
einfache I., E/A I., Vorwärts-I., Bidirektionaler I., einfache I., E/A I., Vorwärts-I., Bidirektionaler I., Random Access I.Random Access I.
– Iterator TagsIterator Tags iterator traits, iterator category, distance type, iterator traits, iterator category, distance type,
iterator tag Klassen, iterator Basisklasseniterator tag Klassen, iterator Basisklassen
– IteratorfunktionenIteratorfunktionen AbstandAbstand
– IteratorklassenIteratorklassen istream, ostream, reverse, raw, sequenceistream, ostream, reverse, raw, sequence
Objektorientiertes Programmieren - Nils Schmeißer
143
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
STL - Algorithmen– nicht mutierenede Verfahrennicht mutierenede Verfahren
for-each, Suche, Zählen, Vergleichfor-each, Suche, Zählen, Vergleich
– mutierende Verfahrenmutierende Verfahren Kopieren, Vertauschen, Transformationen, Ersetzen, Kopieren, Vertauschen, Transformationen, Ersetzen,
Füllen, Generieren, Löschen, PermutierenFüllen, Generieren, Löschen, Permutieren
– SortierenSortieren Sortieren, Zusammenführen, Mengenoperationen, Sortieren, Zusammenführen, Mengenoperationen,
MinMaxMinMax
– allgemeine Verfahrenallgemeine Verfahren inneres Produkt, Partialsummen, Potenziereninneres Produkt, Partialsummen, Potenzieren
Objektorientiertes Programmieren - Nils Schmeißer
144
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
STL - Funktionsobjekte– KonzepteKonzepte
Generatoren, unäre/binäre Funktionen, Generatoren, unäre/binäre Funktionen, Monoid-Operationen, ZufallszahlengeneratorMonoid-Operationen, Zufallszahlengenerator
– vordefinierte Funktionenvordefinierte Funktionen arithmetische Op., Relationen, logische Op.arithmetische Op., Relationen, logische Op.
– function object adaptorsfunction object adaptors
Objektorientiertes Programmieren - Nils Schmeißer
145
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
STL- Utilities/Speicherverwaltung
– KonzepteKonzepte– FunktionenFunktionen
RelationsoperatorenRelationsoperatoren
– KlassenKlassen PaarPaar
– SpeicherklassenSpeicherklassen Allokatoren, IteratorenAllokatoren, Iteratoren
– FunktionenFunktionen Erzeugen, Zerstören, temporärer PufferErzeugen, Zerstören, temporärer Puffer
Objektorientiertes Programmieren - Nils Schmeißer
146
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Streams 1 Streams repräsentieren (gepufferte) ÜbertragungskanäleStreams repräsentieren (gepufferte) Übertragungskanäle Streams gehören Streams gehören nichtnicht zur Sprache C++ zur Sprache C++
DatenquelleDatenquelle DatensenkeDatensenkeÜbertragungskanalÜbertragungskanal
ProgrammProgramm coutcout KonsoleKonsole
Objektorientiertes Programmieren - Nils Schmeißer
147
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Streams 2
prinzipiell könnte eine Streamklasse wie prinzipiell könnte eine Streamklasse wie folgt aussehenfolgt aussehen
template<class T> class template<class T> class StreamStream { { T *buffer; T *buffer; public: public: Stream(unsigned int maxsize); Stream(unsigned int maxsize); void void PutPut(T t);(T t); T T GetGet();();};};
Objektorientiertes Programmieren - Nils Schmeißer
148
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Streams 3class A {class A { Stream<int> *s;Stream<int> *s; public:public: void Attach(Stream<int> *ss);void Attach(Stream<int> *ss); void send(int i);void send(int i); int recv();int recv();};};
void A::Attach(Stream<int> *ss) { s=ss; }void A::Attach(Stream<int> *ss) { s=ss; }void A::send(int i) { s->void A::send(int i) { s->PutPut(i); }(i); }int A::recv() { return s->int A::recv() { return s->GetGet(); }(); }
Stream<int> s;Stream<int> s;A a,b; a.Attach(&s); b.Attach(&s);A a,b; a.Attach(&s); b.Attach(&s);a.send(10); printf(”%\n”,b.recv());a.send(10); printf(”%\n”,b.recv());
Objektorientiertes Programmieren - Nils Schmeißer
149
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Streams 4 um die Nutzung handlicher zu gestalten um die Nutzung handlicher zu gestalten
wurden für die in C++ genutzten Streams wurden für die in C++ genutzten Streams die Operatoren << und >> überladendie Operatoren << und >> überladen
Philosophie:Philosophie:– in einen Datenstrom wird ein Element in einen Datenstrom wird ein Element
eingefügt, alsoeingefügt, also
Stream<T> &operator Stream<T> &operator <<<< (Stream<T>&,T&); (Stream<T>&,T&);......void A::send(int i,int j) { s void A::send(int i,int j) { s <<<< i i <<<< j; } j; }
Objektorientiertes Programmieren - Nils Schmeißer
150
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Streams 5
die C++ Standardbibliothek erklärt zwei die C++ Standardbibliothek erklärt zwei Arten von Standard-StreamsArten von Standard-Streams– bidirektionale Strömebidirektionale Ströme
class ios;class ios;
– unidirektionale Strömeunidirektionale Ströme class ostream:public ios;class ostream:public ios; class istream:public ios;class istream:public ios; Dateiströme: ifstream, ofstreamDateiströme: ifstream, ofstream Stringströme: istrstream, ostrstreamStringströme: istrstream, ostrstream
Objektorientiertes Programmieren - Nils Schmeißer
151
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Streams 6 insbesondere werden zwei spezielle insbesondere werden zwei spezielle
Instanzen bereitgestelltInstanzen bereitgestellt– istream istream cincin;;
unidirektionaler Eingabestrom, der unidirektionaler Eingabestrom, der standardmäßig mit der Konsole als Datenquelle standardmäßig mit der Konsole als Datenquelle verbunden istverbunden ist
– ostream ostream coutcout;; unidirektionaler Ausgabestrom, der unidirektionaler Ausgabestrom, der
standardmäßig mit der Konsole als Datensenke standardmäßig mit der Konsole als Datensenke verbunden istverbunden ist
Objektorientiertes Programmieren - Nils Schmeißer
152
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Streams 7 cin und cout sind am jeweils anderen cin und cout sind am jeweils anderen
Ende mit dem Programm verbundenEnde mit dem Programm verbunden die Operatoren << und >> stehen für die Operatoren << und >> stehen für
alle C++ Standardtypen bereitalle C++ Standardtypen bereit Beispiel:Beispiel: #include <iostream.h>#include <iostream.h>
main() {main() { char name[1024]; char name[1024]; cout << ”What’s your cout << ”What’s your
name?”;name?”; cin >> name; cin >> name; cout << ”Hello ” << name; cout << ”Hello ” << name;}}
Objektorientiertes Programmieren - Nils Schmeißer
153
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Ausnahmebehandlung 1 Beispiel:Beispiel:
– numerische Integration einer Funktion numerische Integration einer Funktion (Summierung mit Schrittweite)(Summierung mit Schrittweite)
– Probleme:Probleme: numerischer Unterlaufnumerischer Unterlauf
– Ergebnis regulär aber falschErgebnis regulär aber falsch numerischer Überlaufnumerischer Überlauf
– Ergebnis kann regulär sein aber falschErgebnis kann regulär sein aber falsch
Möglichkeit solche Zustände zu signalisieren Möglichkeit solche Zustände zu signalisieren und darauf zu reagierenund darauf zu reagieren
Objektorientiertes Programmieren - Nils Schmeißer
154
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Ausnahmebehandlung 2 Exceptions werden als Objekt Exceptions werden als Objekt
repräsentiertrepräsentiertclass class ExceptionclassExceptionclass;;
Exceptions werden durch das Exceptions werden durch das throwthrow Konstrukt “ausgelöst”Konstrukt “ausgelöst”
throwthrow ExceptionclassExceptionclass();();
Handler:Handler: catchcatch ( (ExceptionclassExceptionclass &c) &c) {{ Behandlungscode Behandlungscode}}
Objektorientiertes Programmieren - Nils Schmeißer
155
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Ausnahmebehandlung 3class RangeCheck { public: RangeCheck(char*);};
double integral(double eps) { double sum,psum; if (fabs(psum)<irgendwas) throw RangeCheck(”Underflow”); if (fabs(psum)>irgendwas) throw RangeCheck(”Overflow”);}... try { i=integral(epsilon); } catch (RangeCheck &r) { }
Objektorientiertes Programmieren - Nils Schmeißer
156
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Ausnahmebehandlung 4 Exceptions können in einer Deklaration Exceptions können in einer Deklaration
bekanntgegeben werden:bekanntgegeben werden:externextern double double integralintegral(double) (double) throwthrow((RangeCheckRangeCheck););
vordefinierte Ausnahmeklassen:vordefinierte Ausnahmeklassen: class exception;class exception;
– class logic_error:exception;class logic_error:exception;» class domain_error:logic_error; invalid_argument, length_error, class domain_error:logic_error; invalid_argument, length_error,
out_of_rangeout_of_range– class runtime_error:exception;class runtime_error:exception;
» class range_error:runtime_error; overflow_errorclass range_error:runtime_error; overflow_error– class bad_exception;class bad_exception;
Objektorientiertes Programmieren - Nils Schmeißer
157
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Ausnahmebehandlung 5 Regeln zur Verwendung von ExceptionsRegeln zur Verwendung von Exceptions
Ausnahmebehandlungen so festlegen, daß sie Ausnahmebehandlungen so festlegen, daß sie beschreiben, was eine Funktion beschreiben, was eine Funktion tuttut und nicht, was und nicht, was sie sie tun solltetun sollte
Ausnahmen nur für wesentliche FunktionenAusnahmen nur für wesentliche Funktionen throw(); nur in trivialsten Fällenthrow(); nur in trivialsten Fällen bad_exception sollte immer in die Spezifikation bad_exception sollte immer in die Spezifikation
aufgenommen werdenaufgenommen werden keine A.-Spezifikationen in F.-Templateskeine A.-Spezifikationen in F.-Templates nur allgemeine A.-Spezifikationen für virtuelle M.nur allgemeine A.-Spezifikationen für virtuelle M.
Objektorientiertes Programmieren - Nils Schmeißer
158
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Ausnahmebehandlung 6
keine A.-Spezifikationen in typedefskeine A.-Spezifikationen in typedefs
typedef void(*FooType)(int,int) throw();typedef void(*FooType)(int,int) throw();
terminate_handler nicht in Bibliotheken verändernterminate_handler nicht in Bibliotheken verändern unexpected_handler sollte entweder unexpected_handler sollte entweder
bad_exception oder eine andere gültige bad_exception oder eine andere gültige Ausnahme generierenAusnahme generieren
Objektorientiertes Programmieren - Nils Schmeißer
159
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C++ und Performance
inline-Expansioninline-Expansion Zeigerarithmetik vs. FeldindizierungZeigerarithmetik vs. Feldindizierung temporäre Instanzentemporäre Instanzen
HPC++HPC++
Objektorientiertes Programmieren - Nils Schmeißer
160
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
inline-Expansion normalerweise werden Funktionen bzw. normalerweise werden Funktionen bzw.
Methoden über einen call-Befehl als Methoden über einen call-Befehl als Unterprogramm gerufenUnterprogramm gerufen
inline expandiert den Unterprogrammcode inline expandiert den Unterprogrammcode direkt an der Stelle des Aufrufes (damit direkt an der Stelle des Aufrufes (damit entfällt der call-overhead)entfällt der call-overhead)
auch Methoden können inline expandiert auch Methoden können inline expandiert werdenwerden
Objektorientiertes Programmieren - Nils Schmeißer
161
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Beispielinline double fabs(double x) {inline double fabs(double x) { if (x<0) return -x;if (x<0) return -x; return x;return x;}}double dec(double x) {double dec(double x) { return x-1;return x-1;}}
......double y;double y;
y=dec(4.0);y=dec(4.0);y=fabs(-3.4);y=fabs(-3.4);
ld fp0,-3.4ld fp0,-3.4 ld fp1,fp0ld fp1,fp0 sub fp0,0sub fp0,0 jsgnp M1jsgnp M1 neg fp1neg fp1M1: ld (y),fp1M1: ld (y),fp1
ld fp0,-3.4ld fp0,-3.4 ld fp1,fp0ld fp1,fp0 sub fp0,0sub fp0,0 jsgnp M1jsgnp M1 neg fp1neg fp1M1: ld (y),fp1M1: ld (y),fp1
ld fp0,4.0ld fp0,4.0 push fp0push fp0 call M_deccall M_dec pop fp0pop fp0 ld (Y),fp0ld (Y),fp0
ld fp0,4.0ld fp0,4.0 push fp0push fp0 call M_deccall M_dec pop fp0pop fp0 ld (Y),fp0ld (Y),fp0
Objektorientiertes Programmieren - Nils Schmeißer
162
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Zeigerarithmetik vs. Indizierung in älteren C Compilern waren Feldzugriffe in älteren C Compilern waren Feldzugriffe
über den Index des Feldelementes relativ über den Index des Feldelementes relativ ineffizient implementiert (das ist heute ineffizient implementiert (das ist heute nicht mehr der Fall!)nicht mehr der Fall!)
prinzipiell istprinzipiell ist fürfürT F[dim],*p;T F[dim],*p;
der Zugriff *(p+i) gleichwertig zu F[i]der Zugriff *(p+i) gleichwertig zu F[i]*(p+i)==F[i]; // p+i ~ p+sizeof(T)*i*(p+i)==F[i]; // p+i ~ p+sizeof(T)*i
Objektorientiertes Programmieren - Nils Schmeißer
163
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
temporäre Instanzen 1
problematisch sind temporäre Instanzen, problematisch sind temporäre Instanzen, diese entstehen z.B. bei folgendem diese entstehen z.B. bei folgendem KonstruktKonstruktclass Integer {class Integer { int value; int value; Integer operator + (Integer &b) { Integer operator + (Integer &b) { Integer s; Integer s; s.value=value+b.value; s.value=value+b.value; return Integer(s);return Integer(s); } }};};
Objektorientiertes Programmieren - Nils Schmeißer
164
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
temporäre Instanzen 2
für „größere“ Objekte ist es oft besser für „größere“ Objekte ist es oft besser nur auf +=, -=, *=, /=, ... Operatoren nur auf +=, -=, *=, /=, ... Operatoren zurückzugreifen, da hier die zurückzugreifen, da hier die Konstruktion einer temporären Instanz Konstruktion einer temporären Instanz entfallen kannentfallen kann– der linke Operand erhält hier gleichzeitig der linke Operand erhält hier gleichzeitig
das Ergebnis der Operationdas Ergebnis der Operation
Objektorientiertes Programmieren - Nils Schmeißer
165
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
HPC++ High Performance C++High Performance C++ wird derzeit als ANSI Standard wird derzeit als ANSI Standard
vorbereitetvorbereitet besondere Eigenschaftenbesondere Eigenschaften
Loop level Parallelism: Compiler-DirektiveLoop level Parallelism: Compiler-Direktive Parallele Standard Template Library Parallele Standard Template Library Feld-ContainerFeld-Container Interface für externe Objekte (CORBA)Interface für externe Objekte (CORBA)
Open/MP konformer C++ Compiler ?Open/MP konformer C++ Compiler ?
Objektorientiertes Programmieren - Nils Schmeißer
166
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
C++ und C C++ verwendet einen anderen C++ verwendet einen anderen
Bindungs-/Aufrufmechanismus für Funktionen Bindungs-/Aufrufmechanismus für Funktionen als Cals C
extern “C“ double fabs(double);extern “C“ double fabs(double);#ifdef #ifdef __cplusplus__cplusplus extern “C“ { extern “C“ {#endif#endif int abs(int); int abs(int); #include <string.h> #include <string.h>#ifdef #ifdef __cplusplus__cplusplus } }#endif#endif
Objektorientiertes Programmieren - Nils Schmeißer
167
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Turbo-Pascal, Delphi
Objektorientiertes Programmieren - Nils Schmeißer
168
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Entwicklung
Pascal wurde 1970 von N. Wirth Pascal wurde 1970 von N. Wirth entwickelt (zunächst als reine entwickelt (zunächst als reine Lehrsprache)Lehrsprache)
1983 ISO, DIN1983 ISO, DIN Dialekte: UCSD, MS, MT+, TurboDialekte: UCSD, MS, MT+, Turbo
– Unit Konzept (Module) durch UCSD und Unit Konzept (Module) durch UCSD und BorlandBorland
Objektorientiertes Programmieren - Nils Schmeißer
169
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Eigenschaften erste OO-Sprache unter MS-DOSerste OO-Sprache unter MS-DOS OO seit Version 5.5OO seit Version 5.5 Klasse wird als strukturierter Datentyp Klasse wird als strukturierter Datentyp
erklärt (muß im Typdefinitionsteil eines erklärt (muß im Typdefinitionsteil eines Programmes erklärt werden)Programmes erklärt werden)
nur einfache Vererbungnur einfache Vererbung nur public und privatenur public und private kein Inliningkein Inlining kein ad-hoc Polymorphismuskein ad-hoc Polymorphismus
Objektorientiertes Programmieren - Nils Schmeißer
170
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinitiontype Vector=object
constructor Init(d0:Integer); function Get(i:Integer):Real;
procedure Set(v:Real,i:Integer);private var dim:Integer; x:^Real;end;
Point=object(Vector) ... end;
constructor Vector.Init(d0:Integer);begin ... self.Set(0.0,0);end;
Objektorientiertes Programmieren - Nils Schmeißer
171
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Instanzierung
der Konstruktor muß immer explizit der Konstruktor muß immer explizit gerufen werdengerufen werden– statisch:statisch: var x:ObjectType;var x:ObjectType;
x.Init();x.Init();
– dynamisch:dynamisch:type type PObjectTypePObjectType=^ObjectType;=^ObjectType;var x:var x:PObjectTypePObjectType;;
x:=x:=newnew((PObjectTypePObjectType,Init(...));,Init(...));
Objektorientiertes Programmieren - Nils Schmeißer
172
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Semantik von new und dispose– neue Syntax und Semantik für new:neue Syntax und Semantik für new:
function new(Pointertype [ , Konstruktor ] ) : Pointer;function new(Pointertype [ , Konstruktor ] ) : Pointer; new allokiert Platz auf dem Heap und ruft zusätzlich new allokiert Platz auf dem Heap und ruft zusätzlich
den angegeben Konstruktor aufden angegeben Konstruktor auf new gibt eine Referenz auf den allokierten Bereich new gibt eine Referenz auf den allokierten Bereich
zurückzurück
– new Syntax und Semantik für dispose:new Syntax und Semantik für dispose: procedure dispose(Pointer [ , Destruktor ] );procedure dispose(Pointer [ , Destruktor ] ); dispose ruft den angegebenen Destruktor und gibt dispose ruft den angegebenen Destruktor und gibt
anschließend den Speicher freianschließend den Speicher frei
Objektorientiertes Programmieren - Nils Schmeißer
173
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Destruktion eine Instanz wird zerstört wenneine Instanz wird zerstört wenn
der Gültigkeitsbereich der statischen der Gültigkeitsbereich der statischen Instanzvariablen verlassen wirdInstanzvariablen verlassen wird
der dynamisch allokierte Platz freigegeben wirdder dynamisch allokierte Platz freigegeben wird
in beiden Fällen muß der Destruktor in beiden Fällen muß der Destruktor explizit gerufen werden, alsoexplizit gerufen werden, also
var a:ObjectType; ... a.Init; ... a.Done;var a:ObjectType; ... a.Init; ... a.Done; var p:PObjectType; ... var p:PObjectType; ... p:= p:=newnew(PObjectType,Init);(PObjectType,Init);... ... disposedispose(p,Done);(p,Done);
Objektorientiertes Programmieren - Nils Schmeißer
174
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Polymorphe Methoden
Methoden werden standardmäßig Methoden werden standardmäßig statisch gebundenstatisch gebunden
dynamisch zu bindende Methoden dynamisch zu bindende Methoden werden durch „werden durch „virtualvirtual“ gekennzeichnet“ gekennzeichnet
Beispiel:Beispiel: type ObjectType=objecttype ObjectType=object procedure S; procedure S; procedure V; procedure V;
virtualvirtual; ; end; end;
Objektorientiertes Programmieren - Nils Schmeißer
175
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Bibliotheken
Turbo-Pascal wurde durch das Konzept Turbo-Pascal wurde durch das Konzept der Turbo-Vision Bibliothek sehr der Turbo-Vision Bibliothek sehr erfolgreicherfolgreich
die Turbo-Vision Bibliothek wurde nach die Turbo-Vision Bibliothek wurde nach Turbo-C++ übernommenTurbo-C++ übernommen
unter MS-Windows wurde Object-unter MS-Windows wurde Object-Windows in Anlehnung an die Turbo-Windows in Anlehnung an die Turbo-Vision eingeführtVision eingeführt
Objektorientiertes Programmieren - Nils Schmeißer
176
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Turbo-Vision 1
ist eine Klassenbibliothek zur Erstellung ist eine Klassenbibliothek zur Erstellung SAA konformer NutzerschnittstellenSAA konformer Nutzerschnittstellen
es gibt es gibt – Widget-KlassenWidget-Klassen
Dialogboxen, Fenster, Eingabezeilen, Menüs, ..Dialogboxen, Fenster, Eingabezeilen, Menüs, ..
– eine Applikationsklasseeine Applikationsklasse– eine Ereignisklasseeine Ereignisklasse
Objektorientiertes Programmieren - Nils Schmeißer
177
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Turbo-Vision 2 Beispiel:Beispiel:
program TVGUID01;
uses App;
type TMyApp = object(TApplication) end;
var MyApp: TMyApp;
begin MyApp.Init; MyApp.Run; MyApp.Done;end.
Objektorientiertes Programmieren - Nils Schmeißer
178
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Turbo-Vision 3
Objektorientiertes Programmieren - Nils Schmeißer
179
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Oberon
Objektorientiertes Programmieren - Nils Schmeißer
180
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Eigenschaften
N. Wirth, J. GutknechtN. Wirth, J. Gutknecht System + Oberfläche + SpracheSystem + Oberfläche + Sprache
Nachfolger von Pascal und ModulaNachfolger von Pascal und Modula BlockstrukturBlockstruktur ModulkonzeptModulkonzept strenge Typisierungstrenge Typisierung TyperweiterungTyperweiterung ad-hoc Polymorphismus (Oberon-2)ad-hoc Polymorphismus (Oberon-2) Trait-basiertTrait-basiert
Objektorientiertes Programmieren - Nils Schmeißer
181
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Module
der Hauptblock eines der Hauptblock eines Moduls wird beim Laden Moduls wird beim Laden des Moduls gerufendes Moduls gerufen
ein Modul ist persistentein Modul ist persistent
MODULEMODULE CalcCalc;;IMPORTIMPORT In, Out; In, Out;
VAR a:Integer;VAR a:Integer;
PROCEDUREPROCEDURE SetASetA**();();BEGINBEGIN In.Open; In.Int(a); In.Open; In.Int(a); END END SetASetA;;
PROCEDUREPROCEDURE Privat Privat :: TypTyp ;;BEGINBEGIN ......END END PrivatPrivat;;
BEGINBEGIN ......ENDEND CalcCalc..
System.Compile Calc.Mod;System.Compile Calc.Mod;
Calc.SetA 100Calc.SetA 100
Calc ~System.FreeCalc ~System.Free
Objektorientiertes Programmieren - Nils Schmeißer
182
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassen 1 Klassen werden als Erweiterung von Records Klassen werden als Erweiterung von Records
betrachtetbetrachtetTYPE TYPE AClassPtr = POINTER TO AClass;AClassPtr = POINTER TO AClass;
AClass = RECORDAClass = RECORDpriv_m : PROCEDURE (...);priv_m : PROCEDURE (...);public_mpublic_m**: PROCEDURE (...);: PROCEDURE (...);priv_a : Integer;priv_a : Integer;public_apublic_a**: Typ;: Typ;
END; END;
öffentliche Komponenten werden durch einen öffentliche Komponenten werden durch einen ** gekennzeichnetgekennzeichnet
Objektorientiertes Programmieren - Nils Schmeißer
183
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassen 2
die Bindung erfolgt durch explizite die Bindung erfolgt durch explizite Übergabe der Instanz in einem formalen Übergabe der Instanz in einem formalen ParameterParameterPROCEDURE PROCEDURE ( self : AClass )( self : AClass ) public_m* (...) ; public_m* (...) ;BEGINBEGIN In.Open; In.Open; In.Integer(self.priv_a); In.Integer(self.priv_a);END public_m;END public_m;
Objektorientiertes Programmieren - Nils Schmeißer
184
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung
ursprünglich objektbasiert, also von ursprünglich objektbasiert, also von Objektprototyp abgeleitetObjektprototyp abgeleitet
mögliche Inkonsistenz in Methodenmögliche Inkonsistenz in Methoden SpeicherplatzSpeicherplatz
KlassenbasiertKlassenbasiert TYPE BClassPtr = POINTER TO BClass;TYPE BClassPtr = POINTER TO BClass; BClassBClass = RECORD = RECORD((AClassAClass)) new_m : PROCEDURE(...); new_m : PROCEDURE(...); END; END;
Objektorientiertes Programmieren - Nils Schmeißer
185
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Instanzierung
Oberon verfügt über eine garbage-Oberon verfügt über eine garbage-collection, d.h. Instanzen müssen nur collection, d.h. Instanzen müssen nur erzeugt werdenerzeugt werden
VAR b : BClassPtr;VAR b : BClassPtr;
NEW(b);NEW(b);
genauer: es gibt keine Möglichkeit eine genauer: es gibt keine Möglichkeit eine Instanz explizit zu zerstörenInstanz explizit zu zerstören
Objektorientiertes Programmieren - Nils Schmeißer
186
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Objektorientiertes Programmieren - Nils Schmeißer
187
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Java
Objektorientiertes Programmieren - Nils Schmeißer
188
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Entwicklung
1990 ursprünglich unter dem Namen „Oak“ 1990 ursprünglich unter dem Namen „Oak“ als Sprache für die Programmierung als Sprache für die Programmierung „hybrider Systeme im Consumer Bereich“ (! „hybrider Systeme im Consumer Bereich“ (! Ada) vonAda) vonJ. Gosling bei Sun entworfen, hatte aber J. Gosling bei Sun entworfen, hatte aber nie Erfolgnie Erfolg
1993 in Java umbenannt und als Sprache 1993 in Java umbenannt und als Sprache für Internetanwendungen verwendet (! für Internetanwendungen verwendet (! portabel)portabel)
Objektorientiertes Programmieren - Nils Schmeißer
189
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Eigenschaften 1
C++ ähnliche SyntaxC++ ähnliche Syntax Garbage-collectionGarbage-collection multi-threadingmulti-threading soll sicher und robust seinsoll sicher und robust sein Interpretersprache (basiert auf virtueller Interpretersprache (basiert auf virtueller
Maschine, die Java-Bytecode ausführt),Maschine, die Java-Bytecode ausführt),daher ineffizientdaher ineffizient
Objektorientiertes Programmieren - Nils Schmeißer
190
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Eigenschaften 2
Unterschiede zu C++Unterschiede zu C++ keine Typdefinitionen, kein Pre-Prozessorkeine Typdefinitionen, kein Pre-Prozessor keine Strukturen oder Unionskeine Strukturen oder Unions keine nicht-Member-Funktionenkeine nicht-Member-Funktionen keine Mehrfachvererbungkeine Mehrfachvererbung keine automatisch Typumwandlungkeine automatisch Typumwandlung keine manuelle Speicherverwaltung (!Garbage-keine manuelle Speicherverwaltung (!Garbage-
collection) und Zeigermanipulationcollection) und Zeigermanipulation
Objektorientiertes Programmieren - Nils Schmeißer
191
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinition & Instanzierung Klassen:Klassen:
classclass PointPoint {{ privateprivate double x,y; double x,y; publicpublic PointPoint() { x=0; y=0; }() { x=0; y=0; } public double GetX() { return x; } public double GetX() { return x; } public void SetX(double v) { x=v; } public void SetX(double v) { x=v; }}}
Instazierung:Instazierung:Point p; ... p=Point p; ... p=newnew Point(); Point();
Objektorientiertes Programmieren - Nils Schmeißer
192
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 1 Vererbung in Java bedeutet ErweiterungVererbung in Java bedeutet Erweiterung
class class PixelPixel extendsextends PointPoint { { private int color; private int color; public Pixel() { public Pixel() { super.SetXsuper.SetX(0);(0); color=0; color=0; } }}}
alle Klassen sind von Object abgeleitetalle Klassen sind von Object abgeleitet
Objektorientiertes Programmieren - Nils Schmeißer
193
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung 2 die Vererbung kann durch Festlegung von die Vererbung kann durch Festlegung von
“final” Klassen beschränkt werden“final” Klassen beschränkt werdenfinalfinal class KeineVererbung { class KeineVererbung { ... ...}}
auch die Methodenvererbung kann auch die Methodenvererbung kann eingeengt werdeneingeengt werdenclass Klasse {class Klasse { finalfinal public NichtVererbbar() { ... } public NichtVererbbar() { ... }}}
Objektorientiertes Programmieren - Nils Schmeißer
194
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Interfacevererbung statt Mehrfachvererbung unterstützt Java statt Mehrfachvererbung unterstützt Java
InterfacevererbungInterfacevererbunginterfaceinterface MyInt1MyInt1 { { public void M1(); public void M1();}}interfaceinterface MyInt2MyInt2 { { public void M2(); public void M2();}}class Klasse class Klasse extendsextends Basisklasse Basisklasse implementsimplements MyInt1MyInt1,,MyInt2MyInt2 { {......}}
Objektorientiertes Programmieren - Nils Schmeißer
195
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
abstrakte Methoden wie auch in C++ gibt es die Möglichkeit wie auch in C++ gibt es die Möglichkeit
abstrakte Methoden (abstrakte Klassen) zu abstrakte Methoden (abstrakte Klassen) zu erklärenerklären
abstractabstract class ABaseclass { class ABaseclass { abstractabstract public void M(); public void M();}}
eine Klasse muß abstrakt sein, sobald eine eine Klasse muß abstrakt sein, sobald eine abstrakte Methode existiertabstrakte Methode existiert
Objektorientiertes Programmieren - Nils Schmeißer
196
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Implementierung Definition und Implementation werden in Definition und Implementation werden in
einem Modul gehalteneinem Modul gehalten Klassen können bzgl. eines Moduls lokal Klassen können bzgl. eines Moduls lokal
oder global seinoder global sein Module/Klassen werden durch die Module/Klassen werden durch die
AnweisungAnweisung
importimport Kategorie.Modul.Klasse Kategorie.Modul.Klasse;;
bereitgestelltbereitgestellt
Objektorientiertes Programmieren - Nils Schmeißer
197
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Programme die “Hauptklasse” eines Java-Programms die “Hauptklasse” eines Java-Programms
muß die statisch Methode main enthaltenmuß die statisch Methode main enthaltenclass MyProg {class MyProg { public static void public static void mainmain(String args[]) {(String args[]) { } } ... ...}}
der Modulname muß mit dem der Modulname muß mit dem Haupklassennamen übereinstimmenHaupklassennamen übereinstimmen
Objektorientiertes Programmieren - Nils Schmeißer
198
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Internetanwendungen 1 für “Applets”, die als Internetanwendungen für “Applets”, die als Internetanwendungen
geschrieben werden gibt es ein anderes geschrieben werden gibt es ein anderes VerfahrenVerfahrenimport java.applet.*;import java.applet.*;class MyApplet extends Applet {class MyApplet extends Applet { public void public void startstart() {() { // beim Aufruf des HTML-Dokumentes // beim Aufruf des HTML-Dokumentes } } public void public void stopstop() {() { // beim Verlassen des HTML-Dokumentes // beim Verlassen des HTML-Dokumentes } }}}
Objektorientiertes Programmieren - Nils Schmeißer
199
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Internetanwendungen 2
die Einbindung in das HTML-Protokoll die Einbindung in das HTML-Protokoll erfolgt durcherfolgt durch
<html><html> <body> <body> < <appletapplet codecode=”=”MyApplet.classMyApplet.class”” widthwidth=640 =640 heightheight=480>=480> < </applet/applet>> </body> </body></html></html>
Objektorientiertes Programmieren - Nils Schmeißer
200
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Smalltalk-80
Objektorientiertes Programmieren - Nils Schmeißer
201
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Eigenschaften
reine OO-Sprachereine OO-Sprache untypisiertuntypisiert Interpretersprache (virtuelle Maschine)Interpretersprache (virtuelle Maschine) voll implementiertes voll implementiertes
NachrichtenkonzeptNachrichtenkonzept garbage-collectiongarbage-collection interaktive Programmierumgebunginteraktive Programmierumgebung
Objektorientiertes Programmieren - Nils Schmeißer
202
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
interaktive Programmierungebung
Objektorientiertes Programmieren - Nils Schmeißer
203
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinition
jede Klasse hat eine Superklasse, im jede Klasse hat eine Superklasse, im einfachsten Fall “Object”einfachsten Fall “Object”
Klassen werden in Kategorien geordnetKlassen werden in Kategorien geordnet Klasseneigenschaften:Klasseneigenschaften:
Instanzvariablen: private AttributeInstanzvariablen: private Attribute Klassenvariablen: gemeinsame Attribute a la Klassenvariablen: gemeinsame Attribute a la
static bei C++static bei C++ KategorieKategorie
Objektorientiertes Programmieren - Nils Schmeißer
204
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinition und Vererbung
Superklasse Superklasse subclasssubclass:#:#AClassAClass instanceVariableNamesinstanceVariableNames:’priv1 priv2 ...’:’priv1 priv2 ...’ classVariableNamesclassVariableNames:’shared1 shared2 ...’:’shared1 shared2 ...’ poolDictionariespoolDictionaries:’’:’’ categorycategory:’Kategorie’:’Kategorie’!!
Objektorientiertes Programmieren - Nils Schmeißer
205
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Methodendefinition
Methoden werden ebenfalls kategorisiertMethoden werden ebenfalls kategorisiert
!AClass !AClass methodsFormethodsFor:’methodcategory’!:’methodcategory’!
m1m1 arg1 arg2 ... arg1 arg2 .........!!
Objektorientiertes Programmieren - Nils Schmeißer
206
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Invokation
Smalltalk basiert auf dem Smalltalk basiert auf dem Nachrichtenkonzept, d.h. alle Nachrichtenkonzept, d.h. alle Methodenaufraufe sind Bestandteile Methodenaufraufe sind Bestandteile einer Nachricht an eine Instanzeiner Nachricht an eine Instanz
Empfängerobjekt Sel1 Arg1 Sel2 Arg2 Empfängerobjekt Sel1 Arg1 Sel2 Arg2 ..
Objektorientiertes Programmieren - Nils Schmeißer
207
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
BeispielObject subClass:#ComplexObject subClass:#Complex instanceVariableNames:’imag real’instanceVariableNames:’imag real’ classVariableNames:’’classVariableNames:’’ poolDictionaries:’’poolDictionaries:’’!!
!Complex methodsFor:’arithmetic’!Complex methodsFor:’arithmetic’
Real: rv Imag: ivReal: rv Imag: iv real := rv .real := rv . imag := iv .imag := iv .!!
Selektor1Selektor1
Objektorientiertes Programmieren - Nils Schmeißer
208
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Eiffel
Objektorientiertes Programmieren - Nils Schmeißer
209
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Eigenschaften
von B. Meyer entwickeltvon B. Meyer entwickelt implementiert alle, von ihm implementiert alle, von ihm
aufgezählten Kriterien für OO-Sprachenaufgezählten Kriterien für OO-Sprachen läßt Definition von Vorbedingungen zuläßt Definition von Vorbedingungen zu keine statische Instanzierungkeine statische Instanzierung
Objektorientiertes Programmieren - Nils Schmeißer
210
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Klassendefinitionclassclass MyClassMyClasscreationcreation KonstruktorKonstruktorfeature {ALL}feature {ALL} - oeffentliche Komponenenten- oeffentliche Komponenenten KonstruktorKonstruktor(i:integer) is(i:integer) is dodo ... !!value.make(1,i)... !!value.make(1,i) endendfeature {NONE}feature {NONE} - private Komponenten- private Komponenten value : array [ integer ]value : array [ integer ]endend
Objektorientiertes Programmieren - Nils Schmeißer
211
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vererbung Einfach- und MehrfachvererbungEinfach- und Mehrfachvererbung
classclass DClass DClassinheritsinherits AClass AClass BClass BClass renamerename b1 b1 asas BClassb1 BClassb1 endendendendfeature {ALL}feature {ALL}......endend
Objektorientiertes Programmieren - Nils Schmeißer
212
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Instanzierung
Eiffel kennt keine statisch InstanzierungEiffel kennt keine statisch Instanzierung es werden Instanzvariablen erklärt, die es werden Instanzvariablen erklärt, die
Instanzierung erfolgt explizit durch den Instanzierung erfolgt explizit durch den Aufruf eines KonstruktorsAufruf eines Konstruktors
ivar : DClassivar : DClass
!!!!ivar.Konstruktorivar.Konstruktor
Objektorientiertes Programmieren - Nils Schmeißer
213
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Operatoren in Eiffel können Operatoren überladen und es in Eiffel können Operatoren überladen und es
können neue O. definiert werdenkönnen neue O. definiert werden
infix “ opsymbol ” [ , altname ] infix “ opsymbol ” [ , altname ]
Beispiel:Beispiel:class Complexclass Complexfeature {ALL}feature {ALL} infix ”+”,Plus (b:Complex) is infix ”+”,Plus (b:Complex) is do do ... ... end endendend
Objektorientiertes Programmieren - Nils Schmeißer
214
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Vorbedingungenclass Vectorclass Vectorfeature {ALL}feature {ALL} Dim : integer is Dim : integer is do do return dim; return dim; endend infixinfix ” ”++” (b:Vector):Vector ” (b:Vector):Vector isis reqiurereqiure Dim=b.Dim Dim=b.Dim dodo ...... endendfeature {NONE}feature {NONE} dim : integerdim : integerendend
Objektorientiertes Programmieren - Nils Schmeißer
215
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
FORTRAN 90/95/2000 Fortran 90Fortran 90
– Operatorüberladung (ad-hoc P.)Operatorüberladung (ad-hoc P.)– generische Funktionengenerische Funktionen
Fortran 95Fortran 95– FORALLFORALL– pure und Elementfunktionenpure und Elementfunktionen
Fortran 2000Fortran 2000– OO Eigenschaften:OO Eigenschaften:
» Konstr. und Destr.Konstr. und Destr.» VererbungVererbung» PolymosphismusPolymosphismus» ProzedurreferenzenProzedurreferenzen
Objektorientiertes Programmieren - Nils Schmeißer
216
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
OO-Systeme
OO-GUI‘sOO-GUI‘s OO-BetriebssystemeOO-Betriebssysteme verteiltes OOP (CORBA, DCOM)verteiltes OOP (CORBA, DCOM) OO-DatenbankenOO-Datenbanken
Objektorientiertes Programmieren - Nils Schmeißer
217
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
OO GUI’s
graphische Nutzerschnittstellengraphische Nutzerschnittstellen Philosophie:Philosophie:
SchreibtischphilosophieSchreibtischphilosophie generisch Kommandos (drag and drop)generisch Kommandos (drag and drop) direktes Manipultieren (OLE)direktes Manipultieren (OLE) IconsIcons Persistenz von ObjektenPersistenz von Objekten
Objektorientiertes Programmieren - Nils Schmeißer
218
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
OO-GUI‘s
Beispiele:Beispiele: SmalltalkSmalltalk OberonOberon GeoWorks EnsembleGeoWorks Ensemble NextStepNextStep MS-Windows 3.x, 95 (OLE)MS-Windows 3.x, 95 (OLE) MS-WindowsNTMS-WindowsNT IBM OS/2 Presentation ManagerIBM OS/2 Presentation Manager
Objektorientiertes Programmieren - Nils Schmeißer
219
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Drag and Drop
Erzeugen einer Instanz von B bei Erzeugen einer Instanz von B bei gleichzeitigem Öffnen der Instanz agleichzeitigem Öffnen der Instanz a
Objektorientiertes Programmieren - Nils Schmeißer
220
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
OLE 1.0 OLE - Object Linking and EmbeddingOLE - Object Linking and Embedding
ein Objekt enthält einen Verweis auf ein ein Objekt enthält einen Verweis auf ein anderes Objektanderes Objekt
bei „anklicken“ des enthaltenen Objektes wird bei „anklicken“ des enthaltenen Objektes wird das zugehörige Programm gestartetdas zugehörige Programm gestartet
Objektorientiertes Programmieren - Nils Schmeißer
221
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
OLE 2.0 wie OLE 1.0, aber die Applikation nimmt die Gestalt wie OLE 1.0, aber die Applikation nimmt die Gestalt
der über has-a zugeordneten Anwendung ander über has-a zugeordneten Anwendung an
Objektorientiertes Programmieren - Nils Schmeißer
222
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
OO-Betriebssystem
Mach-KernelMach-Kernel– objektorientierter Betriebssystemkernobjektorientierter Betriebssystemkern
Microsoft Windows mit OLEMicrosoft Windows mit OLE OberonOberon SmalltalkSmalltalk
Objektorientiertes Programmieren - Nils Schmeißer
223
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Verteiltes OOP
CORBACORBA– von der Object Management Group (OMG) von der Object Management Group (OMG)
festgelegter Standardfestgelegter Standard– Common Object Request Broker Common Object Request Broker
ArchitecureArchitecure DCOMDCOM
– Konkurrenzprodukt von MicrosoftKonkurrenzprodukt von Microsoft
Objektorientiertes Programmieren - Nils Schmeißer
224
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Prinzip von der ORB Technik
Client-Server-ArchitekturClient-Server-Architektur
KlassenserverKlassenserver==
ImplementationImplementation
ClientClientder Klasseder Klasse
Object Request BrokerObject Request Broker
Objektorientiertes Programmieren - Nils Schmeißer
225
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Interfacevererbung
CORBA legt nur Interfacevererbung festCORBA legt nur Interfacevererbung fest
KlassenserverKlassenservermit gleichemmit gleichemInterfaceInterfaceClientClient
der Klasseder Klasse
Object Request BrokerObject Request Broker
Class RepositoryClass Repository
Objektorientiertes Programmieren - Nils Schmeißer
226
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
Datenbanken relationale Datenbanken (RDBM)relationale Datenbanken (RDBM)
Menge von RelationenMenge von Relationen R, SQL/DS, DB2,R, SQL/DS, DB2,
INGRES, ORACLE, DBASEINGRES, ORACLE, DBASE
semantisches Datenbankmodell (SMDB)semantisches Datenbankmodell (SMDB) Entity-Relationship Modell, prädikatenlogische und Entity-Relationship Modell, prädikatenlogische und
mengentheoretische Modellemengentheoretische Modelle RM/T, TAXIS, SAM, IFORM/T, TAXIS, SAM, IFO
objektorientiertes Datenbankmodell (OODBM), i.A. objektorientiertes Datenbankmodell (OODBM), i.A. Abbildung von OO Konzepten auf RDBMS oder Abbildung von OO Konzepten auf RDBMS oder SMDBSSMDBS
Objektorientiertes Programmieren - Nils Schmeißer
227
Abteilung Kommunikation und DatenverarbeitungAbteilung Kommunikation und Datenverarbeitung
OODBMS StrukturkonzepteStrukturkonzepte
» Objektidentität, Klassen, Typen, Beziehungen, Objektidentität, Klassen, Typen, Beziehungen, zwischen Klassen, Strukturvererbungzwischen Klassen, Strukturvererbung
OperationenOperationen» Relationen, Generatoren, objekterhaltende Relationen, Generatoren, objekterhaltende
OperationenOperationen
höhere Konzeptehöhere Konzepte» Metaklassen, ADT, OO-KonzepteMetaklassen, ADT, OO-Konzepte
GemStone, ONTOS/VBASE, OGemStone, ONTOS/VBASE, O22, POET, , POET,
POSTGRESPOSTGRES