Objektorientierung - KIT

Werbung
Programmieren I
Überblick „Objektorientierung“
Heusch 12
Ratz 7
Institut für Angewandte Informatik
KIT – Die Forschungsuniversität in der Helmholtz-Gemeinschaft
www.kit.edu
Objektorientierte Softwarenentwicklung
Grundlegendes Konzept der Objektorientierten Softwareentwicklung:
Ein Programm wird als eine Ansammlung diskreter Objekte
betrachten. Diese vereinen sowohl Daten (Variablenwerten) als
auch Verhalten (Operationen) in sich.
Dieses Konzept unterscheidet sich von der konventionellen
Programmierung, bei der Software als eine Ansammlung von
Prozeduren betrachtet wird.
Zentrale Eigenschaften des objektorientierten Ansatzes:
Klassifikation
Identität
Kapselung
Vererbung
Polymorphismus (deutsch: „Vielgestaltigkeit“)
2
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Eigenschaften von Objekten: Klassifikation (1)
Objekte der gleichen Art, d.h. mit den gleichen Variablen
(Daten) und den gleichen Operationen, werden zu Objekten
einer Klasse gruppiert.
Die Klasse selbst ist eine Abstraktion, welche die Variablen
und Operationen der Gattung von Objekten beschreibt.
Die Objekte werden als Instanz ihrer Klasse bezeichnet.
Jede Instanz besitzt eigene Werte für ihre Variablen,
während die Variablennamen und Operationen für alle
Instanzen der Klasse gleich sind.
Die Definition einer Klasse erfolgt im Hinblick auf eine
Anwendung.
Die Wahl von Klassen hängt von der Anwendung ab und ist
grundsätzlich beliebig.
3
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Klassifikation (2)
In Java besteht eine Klasse aus:
Attributen
Methoden
Die Attribute beschreiben die Variablen (Daten) eines
Objektes der Klasse.
Die Methoden beschreiben die Operationen (das Verhalten,
die Funktionen) eines Objekts der Klasse.
Eine Klasse ist ein benutzerdefinierter Datentyp (kurz: Typ).
Sie kann der (Daten-)Typ einer Variablen sein.
Eine Variable, deren Typ eine Klasse ist, speichert eine
Referenz auf ein Objekt der Klasse (Referenzvariable).
4
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Klassifikation: Beispiel (1)
Deklaration einer Klasse
class Cat {
// Attribute = Daten
int age;
// Methoden = Verhalten
void setAge(int a) {
age = a;
}
int getAge() {
return age;
}
Erzeugen von Instanzen,
Deklaration von (Referenz-)Variablen
und Aufruf von Methoden
public static void main(String args[]) {
Cat frisky = new Cat();
frisky.setAge(5);
frisky.meow();
Cat tony;
tony = new Cat();
tony.setAge(6);
tony.meow();
}
void meow() {
System.out.println("Meow!");
}
}
5
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Klassifikation: Beispiel (2)
Zusätzl.: Konstruktoren der Klasse
class Cat {
// Attribute = Daten
int age;
// Konstruktoren
Cat() {
}
Cat(int a) {
age = a;
}
// Methoden = Verhalten
int getAge() { return age; }
void setAge(int a) { age = a; }
Aufruf: bei Erzeugung der Instanz
public static void main(String args[]) {
// Attribut setzen via setter-Methode
Cat frisky = new Cat();
frisky.setAge(5);
frisky.meow();
// Attribut setzen via Konstruktor
Cat tony;
tony = new Cat(6);
tony.meow();
}
Konstruktoren haben den gleichen
Namen wie die Klasse.
void meow() {
System.out.println("Meow!");
}
}
6
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Eigenschaften von Objekten: Identität
Objekte sind diskrete, unterscheidbare Entitäten mit jeweils
eigenen Daten (Attributwerten).
Beispiele:
Figuren in einem (Computer-)Schachspiel
Fenster einer Benutzeroberfläche
Absätze in einem Dokument
Jedes Objekt besitzt eine eigene, inhärente ("ihm
innewohnende") Identität.
Selbst wenn alle Attributwerte von zwei Objekten gleich
sind, sind die zwei Objekte separate, eigenständige
Entitäten
.
7
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Identität: Beispiel
public static void main(String args[]) {
Cat frisky = new Cat();
frisky.setAge(5);
frisky.meow();
Cat tony;
tony = new Cat(6);
tony.meow();
Erzeugung einer
weiteren Katze mit
dem gleichen Alter.
Cat lulu = new Cat();
lulu.setAge(5);
lulu.meow();
}
Es sind dennoch
zwei unterschiedliche
Objekte mit jeweils
eigener Identität.
8
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Eigenschaften von Objekten: Kapselung
Unter Kapselung versteht man das Verbergen von Daten
vor dem Zugriff von außen.
Der direkte Zugriff auf gekapselte (interne) Daten wird
unterbunden.
Der Zugriff erfolgt statt dessen über definierte Schnittstellen.
(„Black-Box-Modell“).
In Java kann die Kapselung von Daten (Sichtbarkeit) über
Modifikatoren festgelegt werden,
z.B. private, public.
Heusch 12.7
Ratz 7.3.3
9
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Kapselung – Beispiel (1)
– ohne Kapselung –
public class Fraction {
public int numerator = 0;
public int denominator = 1;
// public --> Variablen nach
// außen sichtbar
}
10
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Kapselung – Beispiel (2)
– mit Kapselung –
public class Fraction {
private int numerator = 0;
// private --> Variablen sind nicht
private int denominator = 1; // von außen sichtbar
/**
* Setzen des Nenners (denominator).
* Bei Übergabe von d==0 wird der Nenner nicht gesetzt.
*/
public void setDenominator(int d) {
if (d != 0) {
// Abfrage dient zur Fehlervermeidung
denominator = d;
}
}
public int getDenominator() {
return denominator;
}
Getter- und Setter-Methoden
}
11
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Eigenschaften von Objekten: Vererbung (1)
Wozu Vererbung und Ober-/Unterklassen?
Attribute (Variablen)
class Dog {
int age;
class Cat {
int age;
Cat() {
}
Dog() {
}
Cat(int a) {
age = a;
}
Dog(int a) {
age = a;
}
int getAge() { return age; }
void setAge(int a) { age = a; }
int getAge() { return age; }
void setAge(int a) { age = a; }
void meow() {
System.out.println("Meow!");
}
void bark() {
System.out.println("Woof!");
}
}
}
Methoden (Operationen )
12
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Vererbung (2)
Es können allgemeinere Klassen (Oberklassen) definiert
werden.
Diese können dann in detaillierteren Klassen (Unterklassen)
verfeinert werden (=> Klassenhierarchie).
Jede Unterklasse übernimmt (erbt) alle Attribute (Variablen)
und alle Methoden (Operationen) ihrer Oberklasse
Daneben fügt sie ihre eigenen, individuellen Attribute und
Methoden hinzu.
Aber: Konstruktoren werden nicht vererbt.
13
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Beispiel für Vererbung (1)
– Klassen-Deklarationen –
Oberklasse
class Animal {
int age;
Animal() { }
Animal(int a) { age = a; }
int getAge() { return age; }
void setAge(int a) { age = a; }
}
Unterklassen
class Cat extends Animal {
void meow() {
System.out.println("Meow!");
}
}
14
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
class Dog extends Animal {
void bark() {
System.out.println("Woof!");
}
}
Institut für Angewandte Informatik
Beispiel für Vererbung (2)
– Objekte –
Erzeugen von Objekten und Deklaration von Variablen der
Klassen Animal, Cat und Dog
public static void main(String args[]){
Cat frisky = new Cat();
frisky.setAge(5);
frisky.meow();
Dog pluto = new Dog();
pluto.setAge(5);
pluto.bark();
Das geht nicht:
public static void main(String args[]){
Cat frisky = new Cat(5);
Dog pluto;
pluto = new Dog(4);
Animal hugo = new Animal(4);
hugo.bark();
}
Animal hugo = new Animal();
hugo.setAge(4);
}
15
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Eigenschaften von Objekten:
Überladen, Überschreiben, Polymorphismus (1)
Überladen
In der gleichen Klasse darf es mehrere Methoden mit gleichen
Namen, aber mit unterschiedlichen Parametern
(Parameteranzahl oder -typen), geben.
Anzahl und Typ der Parameter im Aufruf entscheidet, welche
von diesen Methoden ausgeführt wird.
Überladung wird zur Übersetzungszeit aufgelöst.
Überschreiben
In einer Klassenhierarchie dürfen in unterschiedlichen Klassen
Methoden mit gleichen Namen und gleichen Parametern sein.
Die Methode der Unterklasse überschreibt dann die Methode
der Oberklasse in der Unterklasse.
16
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Eigenschaften von Objekten:
Überladen, Überschreiben, Polymorphismus (2)
Polymorphismus (auch: Polymorphie; dt. „Vielgestaltigkeit“):
Gibt es in einer Klassenhierarchie sich überschreibende
Methoden, dann gilt für die ausgeführte Methode:
Das Softwaresystem sucht sich zur Laufzeit, passend zum
tatsächlichen Typ des Objektes, die auszuführende Methode
aus.
D.h. der Typ (die Klasse) des Objekts entscheidet – zur Laufzeit
– über die ausgeführte Methode (nicht der Typ der Variable).
Überladung ist kein Polymorphismus!
Heusch 12.3.4
Ratz 7.3.4
17
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Beispiel für Überladen
class Bird {
void move() {
System.out.println("I fly up in the air: flutter flutter!");
}
void move(String parameter) {
System.out.println("I fly up in the air: " + parameter);
}
public static void main(String[] args) {
Bird b = new Bird();
b.move();
b.move("glide glide!");
}
}
> java Bird
I fly up in the air: flutter flutter!
I fly up in the air: glide glide!
18
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Beispiel für Überschreiben u. Polymorphismus (1)
– Deklaration der Klassen –
class Bird {
void move(){
System.out.println("I fly up in the air: flutter flutter!");
}
}
class Songbird extends Bird {
}
class Penguin extends Bird {
void move() {
// Überschreiben
System.out.println("I swim in the water: float float!");
}
}
19
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Beispiel für Überschreiben u. Polymorphismus (2)
– Instanzen und Methodenaufrufe –
public static void main(String[] args) {
Bird b = new Bird();
b.move();
Songbird s = new Songbird();
s.move();
Penguin p = new Penguin();
p.move();
Bird b2;
b2 = p;
b2.move();
Ausgabe
I
I
I
I
fly up in the air:
fly up in the air:
swim in the water:
swim in the water:
flutter flutter!
flutter flutter!
float float!
float float!
// zulässig
// Polymorphismus
}
20
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Mehrfachvererbung
In Java gibt es keine echte Mehrfachvererbung.
Über Schnittstellen (Interfaces) ist eine Art
Mehrfachvererbung möglich.
Das folgende Beispiel aus C++ zeigt eine mögliche
Mehrfachvererbung.
21
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
Institut für Angewandte Informatik
Mehrfachvererbung in C++
class Bird
{
public:
void move()
{
cout<<"I fly up in the air: flutter!";
};
};
class FlyingCat: public Cat, public Bird
{
};
22
W. Geiger, W. Süß, T. Schlachter, C. Schmitt
class Cat
{
private:
int age;
public:
int getAge();
void setAge(int a);
void meow();
};
void main()
{
FlyingCat superCat;
superCat.setAge(5);
superCat.meow();
superCat.move();
};
Institut für Angewandte Informatik
Herunterladen