Vorlesung Datenstrukturen Objektorientierung in C++ (2) Beziehungen zwischen Klassen Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 530
Beziehungen zwischen Klassen Assoziation Beschreibt eine allgemeine Beziehung zwischen zwei Klassen, bei der die Objekte beider Klassen völlig unabhängig voneinander existieren. Aggregation (is-part-of-beziehung) Eine Klasse ist Bestandteil (part-of) einer anderen Klasse, kann aber trotzdem unabhängig von dieser existieren. Komposition Bezeichnet einen Spezialfall der Aggregation, bei der die Existenz der übergeordneten Klasse zwingend notwendig ist Vererbung (is-a-beziehung) Beschreibt die (implizite) Beziehung zwischen zwei Klassen, die in einer Vererbungshierarchie stehen. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 531
Objektbeziehung bei GUIs 2. Selektion per Maus er- laubt automa- tisch auch die Funktionalität Verschiebung des Objekts in Papierkorb 1. Das Verzeichnisobjekt Musik ist eine Komposition von Unterobjekten 3. Verschieben des Objekts in den Papierkorb löscht automatisch auch die abhängigen Komponentenobjekte Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 532
Initialisierung von Komponentenobjekten Standardkonstruktor Ein Standardkonstruktor wird nur dann automatisch generiert, falls keine explizite Konstruktordefinition erfolgt. Konzept der Softwareentwicklung Die Ersetzung des Standardkonstruktors durch einen parametrisierten Konstruktor zwingt zum Initialisieren und hilft somit, inkonsistente Zustände zu vermeiden. class Letter { char letter; public: Letter(char c) { letter = c; } }; Potenzielles Problem Wie initialisiert man Komponentenobjekte ohne Standardkonstruktor? class Name { }; Letter z; Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 533
Initialisierung von Komponentenobjekten Syntax Nach dem Funktionskopf des Konstruktors wird eine durch Doppelpunkt abgetrennte, kommaseparierte Liste mit den zu initialisierenden Attributen und ihren Argumenten angegeben. Dabei erfolgt die Initialisierung in der Reihenfolge der Attribute. Funktionsweise Es erfolgt jeweils ein Konstruktoraufruf für die in der Liste spezifizierten Attribute vor der Abarbeitung des eigentlichen Konstruktors, womit Komponentenobjekte ohne Standardkonstruktor direkt initialisiert werden können. Parameter Parameter des Konstruktors können in der Initialisierungsliste verwendet werden. Zudem kann durch die explizite Initialisierung aller Parameter gleichzeitig ein Standardkonstruktor generiert werden. Orthogonalität Auch Attribute der Grundtypen können mit dieser Syntax initialisiert werden und besitzen damit implizit einen Konstruktor. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 534
Abfolge Konstruktion & Destruktion Problem Vor allem bei nichttrivialen Beziehungen zwischen Komponentenklassen ist es wichtig zu wissen, in welcher Reihenfolge die einzelnen Attribute einer Klasse konstruiert und wieder destruiert werden. Abfolge einer Konstruktion 1. Alle Attribute werden in der Reihenfolge ihrer Definition konstruiert. 2. Der Konstruktor der Klasse wird aufgerufen. Abfolge einer Destruktion 1. Der Destruktor der Klasse wird aufgerufen. 2. Die Destruktion aller Attribute erfolgt in umgekehrter Reihenfolge ihrer Definition. Felder von Objekten Für jede Feldkomponente wird automatisch der Standardkonstruktor und später auch der Destruktor aufgerufen. Deshalb ist bei Verwendung einer Klasse als Feldkomponente die Existenz eines Standardkonstruktors Voraussetzung! Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 535
Vererbung Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 536
Vererbung Motivation Oft wird die Funktionalität einer Klasse in leicht abgewandelter oder erweiterter Form benötigt. Definition Vererbung Vererbung bezeichnet die Fähigkeit einer Klasse, das Verhalten und die Datenstruktur ihrer Instanzen als Obermenge der Definition einer anderen Klasse oder anderer Klassen zu verwenden. Ziele Wiederverwendung von Struktur und Programmcode Realistischere Modellierung Vereinfachte Wartung Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 537
Vererbung Unterklasse Bezeichnet eine Klasse, die das Verhalten einer anderen Klasse erbt. Einer Unterklasse wird in der Regel eigenes Verhalten hinzugefügt, um einen einzigartigen Objekttyp zu definieren. Den Vorgang der Unterklassenbildung nennt man Ableitung oder Spezialisierung. Basisklasse (Oberklasse) Bezeichnet die Klasse, deren Verhalten vererbt wird. Eine Klasse kann eine oder mehrere Basisklassen aufweisen. Inhalt von Unterklassen In der erbenden Klasse müssen ausschließlich neu hinzugekommene Datenelemente und Methoden definiert bzw. schon vorhandene neu implementiert werden. Zusätzlich ist das Ändern der Zugriffsrechte möglich. Integritätsbedingung Ein Objekt einer Klasse ist implizit auch ein Objekt aller Oberklassen. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 538
Beispiel - Vererbung bei GUIs Allen Eingabevarianten ist gemeinsam, dass sie einen Wert zurückliefern, entweder einen vordefinierten aus einer diskreten Wertemenge oder einen direkt eingegebenen Wert. Alle diese unterschiedlichen Eingabeobjekte besitzen eine von einer Basisklasse Eingabeobjekt geerbte Methode getvalue(), die den aktuellen Wert des Eingabeobjekts zurückliefert. Damit ist es leicht möglich, die äußere Erscheinung eines Programms ohne großen Aufwand zu ändern. Im Fenster sind verschiedene Möglichkeiten zur Werteingabe bei der Entwicklung einer grafischen Benutzeroberfläche skizziert: Radiobuttons, vertikale und horizontale Slider, Pop-Up-Menüs und die direkte Eingabe eines Werts. Eingabeobjekt Radio-Button Slider Textfeld Pop-Up vertikal horizontal Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 539
Vererbung - Syntax Syntax class Unterklasse : [ public private protected ] Basisklasse { Implementierung }; Ableitungsart public Die Zugriffsrechte der Basisklasse werden unverändert übernommen. Ableitungsart protected Aus dem Zugriffsrecht public der Basisklasse wird protected, die anderen Zugriffsrechte werden zu private. Zugriffsrecht protected bedeutet, dass nur die eigene und Unterklassen auf derart deklarierte Attribute und Methoden zugreifen können. Ableitungsart private Zugriffsrechte der Unterklasse sind grundsätzlich private. Das Zugriffsrecht private bedeutet, dass ausschließlich innerhalb einer Klasse auf derartige Komponenten zugegriffen werden kann, d.h. dass auf private Komponenten einer Superklasse in einer Unterklasse nicht zugegriffen werden kann (denn dafür gibts protected). Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 540
Konstruktoren & Destruktoren Beachte Konstruktoren, Destruktoren und der Zuweisungsoperator werden nicht vererbt. Konsequenz Konstruktoren und Destruktoren sollten auch in abgeleiteten Klassen implementiert werden, wobei passende Funktionalität der Superklasse genutzt werden kann. Konstruktorreihenfolge 1. Konstruktion der Superklasse 2. Konstruktion der Unterklasse. Destruktorreihenfolge 1. Destruktion der Unterklasse 2. Destruktion der Superklasse. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 541
Methoden in Unterklassen Neue Methoden Eine Unterklasse kann gemäß ihrer Semantik um neue Methoden erweitert werden. Redefinition von Methoden Um spezielle Bedürfnisse der Unterklasse zu realisieren, können existierende Methoden auch umdefiniert werden. Dabei überdeckt die Redefinition jedoch nur die Methode der Basisklasse. Mit Hilfe des Scope-Operators :: kann explizit auch innerhalb von Unterklassen auf umdefinierte Methoden der Basisklasse zugegriffen werden. Syntax des Zugriffs auf Basisklassenmethoden Basisklasse :: Methode ( Argumentliste ) Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 542
Attribute in Unterklassen Neue Attribute Die Unterklasse kann gemäß ihrer Semantik um neue Attribute erweitert werden. Redefinition von Attributen Um spezielle Bedürfnisse der Unterklasse zu realisieren, können existierende Attribute auch umdefiniert werden. Eine Redefinition überdeckt jedoch nur das Attribut der Basisklasse. Mit Hilfe des Scope-Operators :: kann analog Methoden auch innerhalb von Unterklassen auf umdefinierte Attribute der Basisklasse zugegriffen werden. Verwendung Im Gegensatz zur Redefinition von Methoden sollte die Redefinition von Attributen vermieden werden! Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 543
Vererbung überladener Methoden Redefinition überladener Methoden Sobald in der Unterklasse eine überladene Methode aus der Basisklasse redefiniert wird, überdeckt diese Definition alle Varianten aus der Basisklasse. Konsequenz Alle überladenen Methoden der Basisklasse müssen bei Notwendigkeit einer Redefinition in der Unterklasse komplett redefiniert werden. class Super { public: void method(int) {... }; void method(float) {... }; void method(int, int) {... }; }; class Sub : public Super { public: void method(int) {... }; // überschreibt alle Überladungen }; Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 544
Ende der Vorlesung Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 545