Wintersemester 200506 Einfhrung in die Informatik fr Naturwissenschaftler

  • Slides: 20
Download presentation
Wintersemester 2005/06 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die

Wintersemester 2005/06 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich Informatik Lehrstuhl für Algorithm Engineering Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung

Kapitel 11: Vererbung Ziele von Klassen Ø Schon besprochen: ● Kapselung von Attributen (wie

Kapitel 11: Vererbung Ziele von Klassen Ø Schon besprochen: ● Kapselung von Attributen (wie struct in Programmiersprache C) ● Kapselung von klassenspezifischen Funktionen / Methoden ● Erweiterte Möglichkeiten gegenüber struct ● Konstruktoren / Destruktoren ● Überladen von Funktionen (Methoden) und Konstruktoren ● Überladen von Operatoren Ø Neu: ● Effiziente Wiederverwendbarkeit - dazu: → Vererbung Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 2

Kapitel 11: Vererbung Modellierung von Objekten mit geringen Unterschieden Bisherige Mittel zum Modellieren von

Kapitel 11: Vererbung Modellierung von Objekten mit geringen Unterschieden Bisherige Mittel zum Modellieren von „ähnlichen“ Objekten: ● Sei Klasse A bereits definiert (Beispiel: Sparkonten, Kap. 9). ● Wir wollen jetzt Girokonten modellieren → Klasse B. Ansatz: ● Kopiere Code von Klasse A ● Umbenennung in Klasse B ● Hinzufügen, ändern, entfernen von Attributen und Methoden Probleme: ● Aufwändig bei Änderungen (z. B. zusätzlich Freistellungsbetrag für alle Konten) ● Fehleranfällig … und langweilig! Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 3

Kapitel 11: Vererbung Alternative: Vererbung Seien A und B Klassen: ● A ist Oberklasse

Kapitel 11: Vererbung Alternative: Vererbung Seien A und B Klassen: ● A ist Oberklasse von B bzw. B ist Unterklasse von A ● Wir sagen: B erbt Attribute und Methoden von A d. h. B „kennt“ Attribute und Methoden von A (Grad der Bekanntschaft wird gleich noch detailliert angegeben) ● B fügt neue Attribute und Methoden zu denen von A hinzu → ggf. werden (alte) Methoden neu definiert ● Jede Instanz von B ist auch eine Instanz von A Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 4

Kapitel 11: Vererbung Beispiel: Klassen KString und KVersalien Ø Definiere Klasse KString ● Attribute

Kapitel 11: Vererbung Beispiel: Klassen KString und KVersalien Ø Definiere Klasse KString ● Attribute - Zeichenkette - Länge extrem „abgespeckte“ Version der Klasse std: : string ● Methoden - Konstruktor / Destruktor - Set. Value, Get. Value, Length, Print Ø Betrachte Unterklasse KVersalien Für Zeichenketten, die Buchstaben nur als Großbuchstaben aufweisen! Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 5

Kapitel 11: Vererbung Klasse KString: 1. Versuch class KString { private: char* m. Value;

Kapitel 11: Vererbung Klasse KString: 1. Versuch class KString { private: char* m. Value; int m. Length; public: KString(char *s); bool char int void Set. Value(char *s); *Get. Value(); Length(); Print(); … schon ganz gut, aber … Zugriffsspezifikation private wird Probleme machen! → siehe später! ~KString(); }; Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 6

Kapitel 11: Vererbung Grundansatz Vererbung class KVersalien : public KString { … }; Name

Kapitel 11: Vererbung Grundansatz Vererbung class KVersalien : public KString { … }; Name der Unterklasse public besagt an dieser Stelle: Übernahme der Zugriffsspezifikationen von der Oberklasse (hier: von KString) Unterklasse KVersalien erbt von der Oberklasse KString: Attribute und Methoden von KString sind in KVersalien (bedingt) verfügbar! öffentliche Attribute / Methoden private Attribute / Methoden ? ? ? Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 7

Kapitel 11: Vererbung Grundansatz Vererbung class KVersalien : public KString { public: KVersalien(char *s);

Kapitel 11: Vererbung Grundansatz Vererbung class KVersalien : public KString { public: KVersalien(char *s); // Eigener Konstruktor bool Set. Value(char *s); // Überschriebene Methode void Print(); // Überschriebene Methode }; KVersalien möchte von KString erben: • Attribute m. Value und m. Length private! • Methoden Get. Value und Length public! • Destruktor public! Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 8

Kapitel 11: Vererbung Verfeinerung des Grundansatzes Zwei Arten des Verbergens: 1. Geheimnis (auch) vor

Kapitel 11: Vererbung Verfeinerung des Grundansatzes Zwei Arten des Verbergens: 1. Geheimnis (auch) vor Kindern Klasse möchte Attribute und Methoden exklusiv für sich behalten und nicht beim Vererben weitergeben Wahl der Zugriffsspezifikation private 2. „Familiengeheimnisse“ Attribute und Methoden werden nur den Erben (und deren Erben usw. ) bekannt gemacht, nicht aber Außenstehenden Wahl der Zugriffsspezifikation protected Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 9

Kapitel 11: Vererbung Klasse KString: 2. Versuch class KString { protected: char* m. Value;

Kapitel 11: Vererbung Klasse KString: 2. Versuch class KString { protected: char* m. Value; int m. Length; bool char int void Set. Value(char *s); *Get. Value(); Length(); Print(); ~KString(); public: KString(char *s); einzige Veränderung m. Value und m. Length sind allen Unterklassen von KString bekannt! Objekte anderer Klassen können nicht darauf zugreifen! }; Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 10

Kapitel 11: Vererbung Erste Zusammenfassung 1. Alle als public oder protected zugreifbaren Komponenten sind

Kapitel 11: Vererbung Erste Zusammenfassung 1. Alle als public oder protected zugreifbaren Komponenten sind für Erben sichtbar. 2. Die als private charakterisierten Komponenten sind in ihrer Sichtbarkeit auf die Klasse selbst beschränkt. Zugriffspezifikation private protected public Zugriff nur innerhalb der Klasse und ihrer Erben Zugriff sowohl innerhalb der Klasse als auch von außen Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 11

Kapitel 11: Vererbung Sprachliche Regelung: Der Vorgang des Erzeugens einer Unterklasse aus einer Oberklasse

Kapitel 11: Vererbung Sprachliche Regelung: Der Vorgang des Erzeugens einer Unterklasse aus einer Oberklasse durch Vererbung nennen wir ableiten. Hier: Klasse KVersalien wird von der Klasse KString abgeleitet. sorgt für die soeben zusammengefassten Zugriffsregeln beim Vererben class KVersalien : public KString { public: KVersalien(char *s); // Eigener Konstruktor bool Set. Value(char *s); // Überschriebene Methode void Print(); // Überschriebene Methode }; Man sagt auch: public-Ableitung (zur Unterscheidung …) Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 12

Kapitel 11: Vererbung Weitere Formen der Ableitung: ● public-Ableitung Oberklasse: public Oberklasse: protected Oberklasse:

Kapitel 11: Vererbung Weitere Formen der Ableitung: ● public-Ableitung Oberklasse: public Oberklasse: protected Oberklasse: private → Unterklasse: public → Unterklasse: protected → Unterklasse: nicht verfügbar weiteres Ableiten ermöglichen: der Normalfall ● protected-Ableitung Oberklasse: public Oberklasse: protected Oberklasse: private → Unterklasse: protected → Unterklasse: nicht verfügbar Spezialfall ● private-Ableitung Oberklasse: public Oberklasse: protected Oberklasse: private → Unterklasse: nicht verfügbar weiteres Ableiten unterbinden: selten Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 13

Kapitel 11: Vererbung Implementierung der Klasse KString #include <iostream> #include <cstring> #include "KString. h"

Kapitel 11: Vererbung Implementierung der Klasse KString #include <iostream> #include <cstring> #include "KString. h" using namespace std; KString: : KString(char *s) { m. Length = strlen(s); // Länge ohne terminale '' m. Value = new char[m. Length+1]; // +1 für ''-Zeichen! strcpy(m. Value, s); // kopiert auch terminale '' } KString: : ~KString() { delete[] m. Value; m. Length = -1; } Fortsetzung auf nächster Folie … Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 14

Kapitel 11: Vererbung Fortsetzung … int KString: : Length() { return m. Length; }

Kapitel 11: Vererbung Fortsetzung … int KString: : Length() { return m. Length; } void KString: : Print() { cout << m. Value << endl; } char *KString: : Get. Value() { return m. Value; } bool KString: : Set. Value(char *s) { int length = strlen(s); if (length > m. Length) return false; strcpy(m. Value, s); m. Length = length; return true; } Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 15

Kapitel 11: Vererbung Implementierung der abgeleiteten Klasse KVersalien #include <iostream> #include <ctype. h> #include

Kapitel 11: Vererbung Implementierung der abgeleiteten Klasse KVersalien #include <iostream> #include <ctype. h> #include "KVersalien. h" using namespace std; KVersalien: : KVersalien(char *s) : KString(s) { for (int i = 0; i < m. Length; i++) if (islower(m. Value[i])) m. Value[i] = toupper(m. Value[i]); } Zuerst wird der Konstruktor der Oberklasse KString aufgerufen Konstruktor der Klasse KVersalien Ablauf: 1. Zuerst wird Konstruktor von KString aufgerufen, d. h. nach Speicherallokation wird Zeichenkette nach m. Value kopiert und m. Length wird gesetzt. 2. Danach wird Code im Konstruktor von KVersalien ausgeführt. Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 16

Kapitel 11: Vererbung Implementierung der abgeleiteten Klasse KVersalien (Fortsetzung) void KVersalien: : Print() {

Kapitel 11: Vererbung Implementierung der abgeleiteten Klasse KVersalien (Fortsetzung) void KVersalien: : Print() { cout << "KVersalien: : Print -> " << endl; KString: : Print(); } bool KVersalien: : Set. Value(char *s) { if (!KString: : Set. Value(s)) return false; for (int i = 0; i < m. Length; i++) if (islower(m. Value[i])) m. Value[i] = toupper(m. Value[i]); return true; } expliziter Aufruf der Methode der Oberklasse Zeichenkette mit Elternmethode kopieren, falls genug Platz. Dann Versalien erzeugen. Methoden Length(), Get. Value() und der Destruktor werden von der Eltern- / Oberklasse geerbt ! Implementierung fertig! Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 17

Kapitel 11: Vererbung Testumgebung #include <iostream> #include "KString. h" #include "KVersalien. h" using namespace

Kapitel 11: Vererbung Testumgebung #include <iostream> #include "KString. h" #include "KVersalien. h" using namespace std; int main() { KString *s = new KString("a. Bra. Ca. Da. Bra"); s->Print(); KVersalien *v = new KVersalien(s->Get. Value()); v->Print(); s->Set. Value("CUl 8 er"); s->Print(); v->Set. Value(s->Get. Value()); v->Print(); delete s; delete v; } Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 18

Kapitel 11: Vererbung Ausgabe: Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 19

Kapitel 11: Vererbung Ausgabe: Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 19

Kapitel 11: Vererbung Sprachregelungen: • Oberklassen werden Elternklassen, manchmal auch Vaterklassen genannt. • Unterklassen

Kapitel 11: Vererbung Sprachregelungen: • Oberklassen werden Elternklassen, manchmal auch Vaterklassen genannt. • Unterklassen sind von Elternklassen abgeleitete Klassen. • Abgeleitete Klassen werden manchmal auch Tochterklassen genannt. • Die Methoden aus Elternklassen können in den abgeiteten Klassen überschrieben oder redefiniert werden. Zweite Zusammenfassung 1. Häufigste Form der Ableitung ist die public-Ableitung: class B: public A {} 2. Methoden der Elternklassen können benutzt oder überschrieben werden, sofern sie in der Elternklasse public bzw. protected sind. 3. Überschriebene Methoden der Elternklasse können explizit durch Angabe der Elternklasse aufgerufen werden (Bsp: KString: : Set. Value). Rudolph: EINI (WS 2005/06) ● Kap. 11: Vererbung 20