Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

17.04.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.

Ähnliche Präsentationen


Präsentation zum Thema: "17.04.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure."—  Präsentation transkript:

1 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure II Prof. Dr. Gisbert Dittrich

2 15-2 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Gliederung Ziele von Klassen (Wiederholung) Phänomene bei der elementaren Vererbung Syntax Überschreiben von Methoden Auflösung von Zirkularität Einführendes Beispiel: string_Klasse, Woerter_Gross Beispiel: Person, Mann, Frau

3 15-3 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Ziele von Klassen Schon besprochen: Kapselung von Attributen+Methoden (wie struct ) Erweiterte Möglichkeiten gegenüber struct – Überladen von Funktionen – Konstruktoren – Destruktoren Neu: Effiziente Wiederverwendbarkeit – dazu:---> Vererbung

4 15-4 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Neudefinition der Klasse? Bisherige Mittel zum Modellieren von ähnlichen Klassen: Neudefinition der Klasse – z.B.: Code kann kopiert werden. Das ist nicht so gut: langweilig, fehleranfällig, nicht änderungsfreundlich.

5 15-5 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Alternative: Vererbung Seien A und B Klassen. A ist Oberklasse von B ( B ist Unterklasse von A ) --> B erbt Attribute und Methoden von A, d.h. B kennt Attribute und Methoden von A. (Wie genau, wird im folgenden 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 Instanz von A.

6 15-6 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Beispiel: String - Nur Großbuchstaben Definiere String als Klasse: string_Klasse: – Attribute: Zeichenkette, Länge – Methoden: Konstruktor, Destruktor, Lies, Schreibe Betrachte Unterklasse Woerter_Gross: Für Zeichenketten, die Buchstaben nur als Großbuchstaben aufweisen.

7 15-7 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung string_Klasse 1. Versuch class string_Klasse { private: char * s; int laenge; public: string_Klasse(char *); ~string_Klasse(); bool lies(char *); void schreib(); char * dieKette(); int DieLaenge(); }; Nicht gut: siehe später !

8 15-8 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung public besagt an dieser Stelle: Übernahme der Zugriffspezifikationen von string_Klasse in die neue Klasse. die Klasse Woerter_gross erbt von der Klasse string_Klasse: Attribute und Methoden von String_Klasse sind in Woerter_Gross verfügbar. Grundansatz Vererbung class Woerter_Gross:public string_Klasse

9 15-9 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Grundansatz Vererbung class Woerter_Gross:public string_Klasse { public: Woerter_Gross(char *); void schreib(); };

10 15-10 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Verfeinerung des Grundansatzes 2 Arten des Verbergens: Geheimnis (auch) vor den Kindern: – A möchte Eigenschaften für sich behalten und nicht beim Vererben weitergeben: – --> Wahl der Zugriffsspezifikation private Familiengeheimnisse: – Attribute und Methoden werden nur Erben bekannt gemacht, nicht aber Außenstehenden: – --> Wahl der Zugriffsspezifikation protected

11 15-11 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Modifikation von string_Klasse class string_Klasse { protected: char * s; int laenge; public: string_Klasse(char *); ~string_Klasse(); bool lies(char *); void schreib(); char * dieKette(); int DieLaenge(); }; steht also für die Erben (und nur für sie) zur Verfügung

12 15-12 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Zusammenfassung Alle als public oder protected zugreifbaren Komponenten sind für die Erben sichtbar. Die als private charakterisierten Komponenten sind in ihrer Sichtbarkeit auf die Klasse selbst beschränkt.

13 15-13 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung private Zugriff nur innerhalb der Klasse protected Zugriff nur innerhalb der Klasse und ihrer Erben public Komponente ist öffentlich zugänglich Zugriffsspezifikation Klassifikationshierarchie

14 15-14 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Neuer Konstruktor: Heißt ja wie die Klasse public class Woerter_Gross : public string_Klasse { public: Woerter_Gross(char *); void schreib(); }; public besagt hier: Die Zugriffs- spezifikationen für die Komponenten bleiben beim Erben erhalten

15 15-15 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Konstruktor für Woerter Woerter_Gross::Woerter_Gross(char * t) : string_Klasse(t) { for (int i=0; i < laenge ; i++) if (islower(s[i])) s[i] = toupper(s[i]); } Zugriff auf den Konstruktor der Oberklasse string Zugriff auf das Attribut laenge der Oberklasse

16 15-16 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Anmerkung Effekt des Konstruktors (im Beispiel): Es wird ein Objekt vom Typ Woerter_Gross geschaffen; die Buchstaben der initialisierenden Zeichenkette sind Großbuchstaben. Der erste Schritt bei der Erzeugung des Objekts besteht im Aufruf des Konstruktors für die Vaterklasse (Syntax!).

17 15-17 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Redefinition einer Methode Die Methode schreib wird neu definiert (redefiniert, überschrieben); dabei wird die Methode der Vaterklasse verwendet. void Woerter_Gross::schreib(){ cout << Ueberschriebene Methode " << "(Achtung)\t\t"; string_Klasse::schreib(); }

18 15-18 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross,* Vorlage EED, EINI II, * SS 99, überarbeitet GD * demonstriert Vererbung (einfach)*/ #include // verwendete Funktionsprototypen: void strcpy(char * nach, char * von); int strlen(char * r); bool islower(char c); char toupper(char c);

19 15-19 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 1 */ class string_Klasse { protected: char * s; int laenge; public: string_Klasse(char *); ~string_Klasse(); bool lies(char *); void schreib(); char * dieKette(); int DieLaenge(); };

20 15-20 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 2 */ string_Klasse::string_Klasse (char *t) { int lgth = strlen(t); s = new char[lgth+1]; strcpy(s, t); laenge = --lgth; // sonst letztes Zeichen '\0' // mitgezählt } string_Klasse::~string_Klasse() { laenge = -1; delete &s; }

21 15-21 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 3 */ bool string_Klasse::lies(char * r) { int strlen(char *); if (strlen(r) <= laenge+1) { laenge = strlen(r); strcpy(s, r); return true; } else return false; } void string_Klasse::schreib() { cout << s << endl; }

22 15-22 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 4 */ char * string_Klasse::dieKette() { return s;} int string_Klasse::DieLaenge() { return laenge;} class Woerter_Gross: public string_Klasse { public: Woerter_Gross(char *); void schreib(); };

23 15-23 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 5 */ Woerter_Gross::Woerter_Gross(char * t): string_Klasse(t) { for (int i=0; i < laenge ; i++) if (islower(s[i])) s[i] = toupper(s[i]); } void Woerter_Gross::schreib(){ cout << "Ueberschriebene Methode " << "(Achtung)\t\t"; string_Klasse::schreib(); }

24 15-24 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 6 */ int main() { string_Klasse *s = new string_Klasse ("aBra"); s->schreib(); s->~string_Klasse(); Woerter_Gross * grS = new Woerter_Gross("abra"); grS->schreib(); cout << "Laenge: " DieLaenge(); return 0; } Woerter_Gross

25 15-25 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 7 */ void strcpy(char * nach, char * von) { while (*nach++ = *von++); } int strlen(char * r) { int f = 0; while (r[f++]); return f; }

26 15-26 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 8 */ bool islower(char c) { if (('a' <= c) && (c <= 'z')) return true; else return false; } char toupper(char c) { if (islower(c)) return (c - 'a' + 'A'); else return c; }

27 15-27 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Woerter_Gross Ausgabe aBra Ueberschriebene Methode (Achtung) ABRA Laenge: 4

28 15-28 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Zusammenfassung Klasse Woerter_Gross ist Spezialfall der Klasse string_Klasse (Wörter enthalten nur Großbuchstaben). Erbende Klasse kann auf alle nicht als private gekennzeichneten Komponenten zugreifen. Die Zugriffsspezifikation protected wurde eingeführt, um den Zugriff angemessen zu regeln

29 15-29 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Zusammenfassung mußte Ein neuer Konstruktor mußte definiert werden (anderer Name): Der Konstruktor der Oberklasse kann verwendet werden. Eine Methode wurde redefiniert Hierbei wurde auch die gleichnamige Methode des Vaters verwendet. Die Syntax hierfür wurde eingeführt.

30 15-30 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Frau Mann Person Beispiel: Männer und Frauen Gemeinsame Eigenschaften: Name (Beschränkung auf Vornamen), Vater, Mutter. --> Oberklasse: Person – Obige Eigenschaften dort formulieren

31 15-31 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung class Person { private: string * Vorname; Frau * Mutter; Mann * Vater; public: Person(char *); Person(string *); ~Person(); string * DerVorname(); void SetzeMutter(Frau *); void SetzeVater(Mann *); void Druck(char *); }; gemeinsame Eigenschaften gemein- same Methoden

32 15-32 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Anmerkung Gemeinsame Eigenschaften private --> von außen nicht zugreifbar. Auch von Erben nicht: – sonst als protected vereinbart.

33 15-33 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Modellierung der Klasse Frau Konstruktor (aus Namen und aus Person), hat Ehemann, heiratet, ist Ehefrau von. class Frau: public Person { private: Mann * Ehemann; public: Frau(char *); Frau(Person *); void NimmZumManne(Mann *); Mann * EhefrauVon(); };

34 15-34 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Analog: Modellierung Klasse Mann Konstruktor (aus Namen und aus Person), hat Ehefrau, heiratet, ist Ehemann von. class Mann: public Person { private: Frau * Ehefrau; public: Mann(char *); Mann (Person *); void NimmZurFrau(Frau *); Frau * EhemannVon(); };

35 15-35 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Problem: Zirkularität Person erfordert die Kenntnis von Frau, Mann, Mann erfordert die Kenntnis von Person, Frau, Frau erfordert die Kenntnis von Person, Mann. (Erinnert an forward in Pascal.)

36 15-36 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Lösung Deklaration sieht im Programm so aus: class Mann; class Frau; class Person {... }; class Frau: public Person {... }; class Mann: public Person {... }; Dann erst folgen die Definitionen der Methoden. hier werden die Namen bekanntgemacht

37 15-37 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Konstruktoren für Klasse Person Konstruktoren für die Klasse sind überladen, einmal Zeichenkette, dann string als Parameter. Person::Person(char * v) { Vorname = new string(v); Vater = NULL; Mutter = NULL; } Person::Person(string * s) { Vorname = s; Vater = NULL; Mutter = NULL; }

38 15-38 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Weitere Methoden Destruktor: Ruft nur den Destruktor für die Zeichenkette auf Person::~Person() { Vorname->~string(); } n Die anderen Methoden (bis evtl. auf Druck) sollten klar sein. Die Methode Druck druckt den Vornamen aus und ruft ggf. die Druck- Methode für Vater und für Mutter auf.

39 15-39 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung void Person::Druck(char * s) { cout << s << "(Vorname) " dieKette() << endl; if(Mutter != NULL) { cout << "\nDaten der Mutter:\n"; Mutter->Druck(""); } if(Vater != NULL) { cout << "\nDaten des Vaters:\n "; Vater->Druck(""); } };

40 15-40 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Bemerkenswert Aufrufe Vater->Druck() und Mutter->Druck() benutzen die Tatsache, daß Vater und Mutter auch vom Typ Person sind. In den Klassen Mann oder Frau sind keine neuen Methoden Druck vereinbart! Dies deutet an: Vererbung erlaubt flexible Modellierung und Programmierung.

41 15-41 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Konstruktoren und Methoden für die Klasse Mann Mann::Mann(char * v) :Person(v) { Ehefrau = NULL; } Mann::Mann(Person *p) : Person(p->DerVorname()){ Ehefrau = NULL; } void Mann::NimmtZurFrau(Frau * thisLady) { Ehefrau = thisLady; } Frau * Mann::EhemannVon(){ return Ehefrau; }

42 15-42 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Heiratsroutine void Verheirate(Mann * m, Frau * f){ m->NimmZurFrau(f); f->NimmZumManne(m); } Bemerkenswert: steht außerhalb der Klassendefinitionen.

43 15-43 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung int main() { Mann * Adam = new Mann("Adam"); Frau * Eva = new Frau("Eva"); Mann * Kain = new Mann("Kain"); Kain->SetzeMutter(Eva); Kain->SetzeVater(Adam); Mann * Abel = new Mann("Abel"); Abel->SetzeMutter(Eva); Abel->SetzeVater(Adam); Adam->Druck("Zu Adam: "); Eva->Druck("\nZu Eva:"); Kain->Druck("\n\nAngaben zu Kain:"); Abel->Druck("\n\nAngaben zu Abel:"); Verheirate(Adam, Eva); cout << "\nverheiratet?\n"; Eva->EhefrauVon()-> Druck("\tEva ist verheiratet mit:\n"); Adam->EhemannVon()-> Druck("\tAdam ist verheiratet mit :\n "); return 0;} Mann-Frau

44 15-44 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Mann-Frau : Ausgabe Zu Adam: (Vorname) Adam Zu Eva:(Vorname) Eva Angaben zu Kain: (Vorname) Kain Daten der Mutter: (Vorname) Eva Daten des Vaters: (Vorname) Adam Angaben zu Abel: (Vorname) Abel Daten der Mutter: (Vorname) Eva Daten des Vaters: (Vorname) Adam verheiratet? Eva ist verheiratet mit: (Vorname) Adam Adam ist verheiratet mit: (Vorname) Eva (umformatiert: GD )

45 15-45 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen // Vorlage EED EINI II, SS 99, prog-27a; // Überarbeitet: GD // demonstriert Vererbung // #include #include "clstring.h" class Mann; class Frau; void Verheirate(Mann *, Frau *);

46 15-46 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 1 class Person { private: stringcl * Vorname; Frau * Mutter; Mann * Vater; public: Person(char *); Person(stringcl *); ~Person(); stringcl * DerVorname(); void SetzeMutter(Frau *); void SetzeVater(Mann *); void Druck(char *); };

47 15-47 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 2 class Frau: public Person { private: Mann * Ehemann; public: Frau(char *); Frau (Person *); void NimmZumManne(Mann *); Mann * EhefrauVon();}; class Mann: public Person { private: Frau * Ehefrau; public: Mann(char *); Mann (Person *); void NimmZurFrau(Frau *); Frau * EhemannVon();};

48 15-48 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 3 Person::Person(char * v) { Vorname = new stringcl(v); Vater = NULL; Mutter = NULL;} Person::Person(stringcl * s) { Vorname = s; Vater = NULL; Mutter = NULL;} Person::~Person() { Vorname->~stringcl();} stringcl * Person::DerVorname() { return Vorname;} void Person::SetzeMutter(Frau * Mom) { Mutter = Mom;} void Person::SetzeVater(Mann * Dad) { Vater = Dad;}

49 15-49 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 4 void Person::Druck(char * s) { cout << s << "\t(Vorname) " dieKette() << endl; if(Mutter != NULL) { cout << "\nDaten der Mutter: " << endl; Mutter->Druck("");} if(Vater != NULL) { cout << "\nDaten des Vaters: " << endl; Vater->Druck("");}}; Frau::Frau(char * v) :Person(v) { Ehemann = NULL;} Frau::Frau(Person *p) :Person(p->DerVorname()){ Ehemann = NULL;}

50 15-50 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 5 void Frau::NimmZumManne(Mann * erDa) { Ehemann = erDa;} Mann * Frau::EhefrauVon(){ return Ehemann;} Mann::Mann(char * v) :Person(v) { Ehefrau = NULL;} Mann::Mann(Person *p) :Person(p->DerVorname()){ Ehefrau = NULL;} void Mann::NimmZurFrau(Frau * thisLady) { Ehefrau = thisLady;}

51 15-51 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 6 Frau * Mann::EhemannVon(){ return Ehefrau;} void Verheirate(Mann * m, Frau * f){ m->NimmZurFrau(f); f->NimmZumManne(m); } int main() { Mann * Adam = new Mann("Adam"); Frau * Eva = new Frau("Eva"); Mann * Kain = new Mann("Kain"); Kain->SetzeMutter(Eva); Kain->SetzeVater(Adam);

52 15-52 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 7 //int main() {Fortsetzung !!!! Mann * Abel = new Mann("Abel"); Abel->SetzeMutter(Eva); Abel->SetzeVater(Adam); Adam->Druck("Zu Adam: "); Eva->Druck("\nZu Eva:"); Kain->Druck("\n\nAngaben zu Kain:"); Abel->Druck("\n\nAngaben zu Abel:"); Verheirate(Adam, Eva); cout << "\nverheiratet?\n"; Eva->EhefrauVon()->Druck("\tEva ist verheiratet mit: \n"); Adam->EhemannVon()->Druck("\tAdam ist verheiratet mit: \n"); return 0; }

53 15-53 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Hilfsklasse stringcl in Datei "clstring.h" // Vorlage EED EINI II SS99, // überarbeitet GD void strcpy(char * nach, char * von); int strlen(char * r); bool islower(char c); char toupper(char c); void strcpy(char * nach, char * von) { while (*nach++ = *von++);} int strlen(char * r) { int f = 0; while (r[f++]); return f;}

54 15-54 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Hilfsklasse stringcl, Fortsetzung 1 bool islower(char c) { if (('a' <= c) && (c <= 'z')) return true; else return false; } char toupper(char c) { if (islower(c)) return (c - 'a' + 'A'); else return c; }

55 15-55 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Hilfsklasse stringcl, Fortsetzung 2 class stringcl { protected: char * s; int laenge; public: stringcl(char *); ~stringcl(); bool lies(char *); void schreib(); char * dieKette(); int DieLaenge(); };

56 15-56 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Hilfsklasse stringcl, Fortsetzung 3 stringcl::stringcl (char *t) { int lgth = strlen(t); s = new char[lgth+1]; strcpy(s, t); laenge = --lgth;} stringcl::~stringcl() { laenge = -1; delete &s;} bool stringcl::lies(char * r) { int strlen(char *); if (strlen(r) <= laenge) { laenge = strlen(r); strcpy(s, r); return true;} elsereturn false;}

57 15-57 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Hilfsklasse stringcl, Fortsetzung 4 void stringcl::schreib() { cout << s << endl; } char * stringcl::dieKette() { return s;} int stringcl::DieLaenge() { return laenge;}


Herunterladen ppt "17.04.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure."

Ähnliche Präsentationen


Google-Anzeigen