Folien zu Blatt 01 - Sosy-Lab

Werbung
Softwaretechnik WS 16/17
Übungsblatt 01
Was ist eine Klasse?
●
●
Definition der Object Management Group:
„A class describes a set of objects that share
the same specifications of features, constraints,
and semantics.“
Definition von B. Oestereich:
„Eine Klasse ist die Definition der Attribute,
Operationen und der Semantik für eine Menge
von Objekten. Alle Objekte einer Klasse
entsprechen dieser Definition.“
Was ist eine Klasse?
●
Ein Bauplan für die Erstellung gleichartiger Objekte.
●
Beispiel:
public class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
Point
-x: int
-y: int
+getX()
...()
public int getX() {
return x;
}
…
}
●
Oft modelliert eine Klasse ein Ding der realen Welt.
Was ist ein Objekt?
●
Definition von B. Oestereich:
„Ein Objekt ist eine im laufenden System
konkret vorhandene und agierende Einheit.
Jedes Objekt ist ein Exemplar einer Klasse. Ein
Objekt enthält durch Attribute repräsentierte
Information, deren Struktur in der Klasse
definiert ist. [...]“
Was ist ein Objekt?
●
Eine Instanz einer Klasse
●
Nutzt Verhalten der Klasse, speichert Daten
●
In Java angelegt mit „new“
●
Beispiel:
// 2 Objekte anlegen:
Point p1 = new Point(1, 1);
Point p2 = new Point(2, 3);
assert p1.getX() != p2.getX();
// Kein neues Objekt!
Point p3 = p1;
assert p1.getX() == p3.getX();
Was ist ein Interface?
●
●
Definition der Object Management Group:
„An interface is a kind of classifier that represents
a declaration of a set of coherent public features
and obligations. An interface specifies a contract;
any instance of a classifier that realizes the
interface must fulfill that contract.“
Definition von B. Oestereich:
„Schnittstellen beschreiben einen Teil des extern
sichtbaren Verhaltens [...]“
Was ist ein Interface?
●
●
Definiert minimale Fähigkeiten einer Klasse
Beispiele in Java:
java.util.Iterator
java.lang.Comparable
public interface Comparable<T> {
/**
* Compares this object with the specified object for order.
* Returns a negative integer, zero, or a positive integer
* as this object is less than, equal to, or greater than
* the specified object. […]
*/
public int compareTo(T other);
}
Was ist dynamische Bindung?
●
Bei dynamischer Bindung wird erst zur Laufzeit
festgelegt, welche Methode bei einem Methodenaufruf
tatsächlich aufgerufen wird. Ausschlaggebend hierbei
ist der Laufzeittyp des Objekts, auf dem die Method
aufgerufen wird.
List<Point> lst;
if (rand() == 0) {
lst = new ArrayList<>();
} else {
lst = new LinkedList<>();
}
// Hier wird das richtige „add“ je nach Typ der Liste aufgerufen
// obwohl der Compiler nicht weiß, von welchem Typ „lst“ sein wird.
lst.add(new Point(0, 0));
Vorteile
●
Interfaces und dynamische Bindung
ermöglichen Abstraktion und Wiederverwendung
public class Point implements Comparable<Point> { … }
List<Point> lst = new ArrayList<>();
lst.add(new
lst.add(new
lst.add(new
lst.add(new
Point(0, 0));
Point(3, 3));
Point(0, 2));
Point(-1, 5));
Collections.sort(lst);
●
Collections.sort kann jede Art von Liste sortieren
mit jeder Art von Elementtyp, solange Comparable
implementiert wird.
Klasse Point
●
Implementieren Sie eine Klasse Point, die einen Punkt in der Ebene
repräsentieren soll.
●
Ein Point besteht aus einer x- und einer y-Koordinate.
●
Die Koordinaten werden dem Konstruktor übergeben.
●
Zusätzlich soll die folgende Ordnung auf Punkten definiert sein:
●
–
Zwei Points sind gleich, wenn sie in x- und y-Koordinate übereinstimmen;
–
ein Punkt p1 ist kleiner als ein Punkt p2,
wenn entweder die x-Koordinate von p1 kleiner als die x-Koordinate von p2 ist,
oder wenn die x-Koordinaten übereinstimmen und die y-Koordinate von p1
kleiner als die von p2 ist.
–
In den verbliebenen Fällen ist p1 größer als p2.
Implementieren Sie dazu das Interface Comparable.
Vererbung
●
Implementieren Sie die Klassen Cat, Dog und Horse, die Tiere
repräsentieren.
●
Alle Tiere haben ein Alter.
●
Jedes Tier kann entsprechend seiner Art ein Geräusch machen.
●
Hunde und Katzen sind Haustiere, die einen Namen haben.
●
●
Jede Klasse soll eine geeignete toString Methode haben,
die alle im Objekt gespeicherten Informationen ausgibt.
Vermeiden Sie bei der Implementierung doppelten Code und
machen Sie die Klassen so allgemein verwendbar wie möglich.
Naive Lösung
Cat
●
●
Dog
-age
-name
-age
-name
+getAge(): int
+setAge(int)
+getName(): String
+makeNoise()
+toString()
+getAge(): int
+setAge(int)
+getName(): String
+makeNoise()
+toString()
Horse
-age
+getAge(): int
+setAge(int)
+makeNoise()
+toString()
Viel doppelter Code
Code zum behandeln von Tieren braucht
Spezialfälle für jedes einzelne Tier
Abstraktion und Wiederverwendung
durch Vererbung
Animal
-age
+getAge(): int
+setAge(int)
+makeNoise()
+toString()
Pet
-name
+getName(): String
Cat
Dog
Horse
+makeNoise()
+toString()
+makeNoise()
+toString()
+makeNoise()
+toString()
Herunterladen