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()