Unter- und Oberklassen: Beispiel

Slides:



Advertisements
Ähnliche Präsentationen
C Sharp (C#) Martin Saternus Senior Student Partner
Advertisements

Algorithmentheorie 08 – Dynamische Programmierung (1)
der Universität Oldenburg
Objektorientierte Programmierung
der Universität Oldenburg
Abstrakte Klassen Basisklassen sollten in der Regel sehr allgemein sein. Oft ist es nicht notwendig, dass Objekte dieser generellen Basisklassen angelegt.
Programmierung II Prof. Dr. Michael Löwe
Delphi-Schulung am Autor: Jörg Altegoer
Kritische Betrachtung
10. Grundlagen imperativer Programmiersprachen
Warum Objektorientierung?
FH-Hof Einbindung von JavaScript Anweisungen
Java: Objektorientierte Programmierung
Indirekte Adressierung
Java: Grundlagen der Objektorientierung
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 5 Polymorphismus Sommersemester 2003 Lars Bernard.
Informatik II (für Fakultät Maschinenwesen)
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
C++ Vererbung und Polymorphie
DVG Klassen und Objekte
Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Delphi II - OOP IFB Fortbildung
Listen Klaus Becker KB Listen 2 Listen Ansgar A., Speyer Claudia B., Koblenz Knut B., Neustadt Annett B., Wörrstadt Stefani D., Bad Ems Jochen F.,
Grundkonzepte der objektorientierten Programmierung Teil 3
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2010/11 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Modellierung grafischer Objekte
Bausteine zum objektorientierten Programmieren mit Delphi
Modellierung grafischer Objekte
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Dynamische Datentypen
EPROG Tutorium #6 Philipp Effenberger
EPROG Tutorium #5 Philipp Effenberger
Agenda für heute, 7. April, 2005 Bedingte ProgrammausführungBedingte Programmausführung Algorithmische Grundlagen Vergleichsoperatoren, Wahrheitswerte.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Vererbung Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
Java-Kurs Übung Besprechung der Hausaufgabe Vererbung
Java-Kurs Übung Besprechung der Hausaufgabe
Java-Kurs Übung Besprechung der Hausaufgabe Vererbung
Einführung in die Programmierung mit Java
IT2 – WS 2005/20061Nov 14, 2005 Visibility  public: Sichtbar in allen Paketen  protected: Sichtbar innerhalb des Pakets und in den Unterklassen  (default,
Objektorientierte (OO) Programmierung
Vererbung. Klassen - Vererbung  Eine Klasse kann von einer Basisklasse abgeleitet werden  Die abgeleitete Klasse erbt die Eigenschaften und Methoden.
C++ FÜR cOMPUTERSPIELENTWICKLER
Tutorium Software-Engineering SS14 Florian Manghofer.
Dr. Wolfram Amme, Virtuelle Vererbung, Informatik II, FSU Jena, SS Auflösung von Konflikten bei Mehrfachvererbung Umbenennung mehrdeutiger Methoden.
1 Grundsätze objektorientierter Programmierung. Dr. Wolfram Amme, Grundsätze objektorientierter Programmierung, Informatik II, FSU Jena, SS Objektorientierte.
1 Eine Einführung in die objektorientierte Programmierung.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
OOP II.
Einführung in die Programmierung mit Java
Einführung in die Programmierung
Implementieren von Klassen
Polymorphie Überschreiben
 Präsentation transkript:

Unter- und Oberklassen: Beispiel type KFZ = class kennzeichen: String; ... end; PKW = class(KFZ) tueren: integer end; LKW = class(KFZ) nutzlast: integer end; ... var k: KFZ; p: PKW; ... p := PKW.Create; p.kennzeichen := "DD-XX 1"; p.tueren := 5; k := p; ... Zugriff auf k.kennzeichen ... Jeder PKW ist ein KFZ: Die Zuweisung eines Objekts der Unterklasse an eine Variable der Oberklasse ist zulässig. Bei der Zuweisung gehen keinerlei Informationen verloren, das Objekt bleibt unverändert.

Typanpassung type KFZ = class kennzeichen: String; ... end; PKW = class(KFZ) tueren: integer end; LKW = class(KFZ) nutzlast: integer end; ... var k: KFZ; p: PKW; ... p := PKW.Create; p.kennzeichen := "DD-XX 1"; p.tueren := 5; k := p; ... ... Zugriff auf k.tueren ... ->Fehlermeldung ... Zugriff auf (k as PKW).tueren Der "as" Operator dient zur Typanpassung innerhalb von Klassenhierarchien. "k as PKW" ist vom Typ "PKW" Die Typanpassung kann fehlschlagen (Laufzeitfehler).

Regeln zur Typanpassung Jedes Objekt hat immer eine eindeutige Klassenzugehörigkeit, die sich von der Erzeugung bis zur Löschung nicht ändert. Einer Variable von einem Klassentyp K können Objekte der Klasse K und jeder Unterklasse von K zugewiesen werden. Der Zugriff auf ein Datenfeld, eine Methode oder eine Eigenschaft eines Objekts o ist nur möglich, wenn dies in der Klassendefinition der Klasse von o vorgesehen ist. Wenn ein Objekt o1 von einer Unterklasse K1 einer Klasse K ist, aber über eine Variable der Klasse K zugänglich ist, so kann o1 mittels des "as"-Operators (o1 as K1) auch wie ein Objekt der Klasse K1 behandelt werden ("Typanpassung", "down-cast"). Seien K1 und K2 verschiedene Unterklassen von K, o1 ein Objekt der Klasse K1, das über eine Variable der Klasse K zugänglich ist. Die Typanpassung "o1 as K2" führt zu einem Laufzeitfehler. Ein Test, ob ein Objekt o einer Klasse K zur Unterklasse K1 gehört, ist mit "o is K1" möglich.

Frühe und späte Bindung Frühe Bindung: Im allgemeinen wird die bei Eintreffen einer bestimmten Nachricht aufzurufende Methode bereits zur Übersetzungszeit, abhängig von der Klassenzugehörigkeit des angesprochenen Objekts, bestimmt. Späte Bindung: In manchen Fällen ist zur Übersetzungszeit nur eine Oberklasse des zur Laufzeit angesprochenen Objekts bekannt. In diesem Fall kann man die Wahl der aufzurufenden Methode von der erst zur Laufzeit bekannten Unterklasse abhängig machen. Späte Bindung in Object Pascal: "virtuelle Methoden", Schlüsselworte virtual und dynamic (Unterschied zwischen virtual/dynamic nur in Optimierungen.) Deklaration von Methoden, die virtuelle Methoden (in Unterklassen) "überdefinieren": Schlüsselwort override Implementierung: Virtual Method Table (VMT)

Polymorphie von Methoden (1) type KFZ = class kennzeichen: String; ... procedure anmelden(k: KFZDaten); virtual; end; PKW = class(KFZ) tueren: integer ... procedure anmelden(k: KFZDaten); override; end; LKW = class(KFZ) nutzlast: integer ... procedure anmelden(k: KFZDaten); override; var k: KFZ; p: PKW; ... p := PKW.Create; ... p.kennzeichen := "DD-XX 1"; p.tueren := 5; k := p; k.anmelden(...);

Polymorphie von Methoden (2) gleicher Methodenname in Ober- und Unterklasse semantische Ähnlichkeit (!) der Methodenrümpfe dynamische Auswahl der Implementierung Prinzip: TObject Methoden- Vererbung Operationen- Suche zur Laufzeit nach der speziellsten Version ("dynamisches Binden") KFZ PKW

TObject Alle Klassen in Object Pascal sind implizit von der Basisklasse TObject abgeleitet. Ungefähre Struktur: TObject = class constructor Create; // Speicherplatzreservierung // Festlegung der Adresse (Identität) procedure Free; //Aufruf von Destroy //falls Adresse ≠ nil destructor Destroy; virtual; end;

Konstruktoren für Unterklassen Möglichkeit 1: Standardkonstruktor (aus TObject) verwenden. var obj: K; obj := K.Create; Möglichkeit 2: Eigener Konstruktor. type K = class(K0) var X, Y: integer; constructor Create(Xinit,Yinit: integer); end; constructor K.Create(Xinit,Yinit : integer); begin inherited Create; X := Xinit; Y := Yinit; end; var obj: K; obj := K.Create(10,20); Möglichkeit 3: Standardkonstruktor (aus TObject) verwenden und eigene Initialisierungsprozedur ("Init").

Destruktoren für Unterklassen type K = class(K0) var X, Y: integer; constructor Create(Xinit,Yinit: integer); ... destructor Destroy; override; end; Regeln für Destruktoren: Immer indirekt über Free aufrufen (vermeidet Laufzeitfehler) Im Rumpf immer als letzte Aktion Destruktor der Oberklasse aufrufen. destructor K.Destroy(Xinit,Yinit : integer); begin ... inherited Destroy; end;

Beispiel: Bauteileverwaltung Jedes Bauteil hat eine Bauteilnummer (Zeichenreihe) und einen Preis (Ganzzahl). Bauteile können Elemente und Baugruppen sein. Eine Baugruppe besteht aus mehreren Bauteilen. Für ein Element ist der Preis direkt festgelegt, für Baugruppen berechnet er sich aus der Summe der Preise der enthaltenen Bauteile.

Klassenstruktur für Bauteile-Beispiel (1) type TBauteil = class bauteilNr: string; function gibPreis: integer; virtual; end; TElement = class(TBauteil) preis: integer; constructor Create(n: string; p: integer); function gibPreis: integer; override; TBaugruppe = class(TBauteil) bauteile: array of TBauteil; constructor Create(n: string); procedure bauteilHinzu (b: TBauteil); function gibAnzahl: integer;

Abstrakte Methoden Methoden, für die keine Implementierung gegeben werden kann, sondern die ausschließlich als Platzhalter für speziellere Implementierungen dienen, werden "abstrakt" genannt. Schlüsselwort "abstract" Klassen, die abstrakte Methoden enthalten, heißen auch "abstrakte Klassen". Beispiel: Was ist die Implementierung der Methode "gibPreis" für die Oberklasse TBauteil? type TBauteil = class bauteilNr: string; function gibPreis: integer; virtual; abstract; end;

Sichtbarkeit Öffentlich = public Privat = private Sichtbar in der aktuellen Unit Nur für Unterklassen = protected Auch sichtbar in Unterklassen in einer anderen Unit Geheimnisprinzip: Grundsätzlich sollte so viel wie möglich der in einem Objekt gespeicherten Information als "privat" deklariert werden. Erhöhung der Wartungsfreundlichkeit und Stabilität.

Klassenstruktur für Bauteile-Beispiel (2) type TBauteil = class public bauteilNr: string; function gibPreis: integer; virtual; abstract; end; TElement = class(TBauteil) private preis: integer; constructor Create(n: string; p: integer); function gibPreis: integer; override; TBaugruppe = class(TBauteil) bauteile: array of TBauteil; constructor Create(n: string); procedure bauteilHinzu (b: TBauteil); function gibAnzahl: integer;

Implementierung Bauteile-Beispiel (1) constructor TElement.Create(n: string; p: integer); begin bauteilNr := n; preis := p; end; function TElement.gibPreis: integer; gibPreis := preis; constructor TBaugruppe.Create(n: string); procedure TBaugruppe.bauteilHinzu(b: TBauteil); SetLength(bauteile,Length(bauteile)+1); bauteile[High(bauteile)] := b;

Implementierung Bauteile-Beispiel (2) function TBaugruppe.gibPreis: integer; var i,p: integer; begin p := 0; for i:=0 to High(bauteile) do p := p + bauteile[i].gibPreis; gibPreis := p; end; function TBaugruppe.gibAnzahl: integer; var i,a: integer; a := 0; if bauteile[i] is TBaugruppe then a := a + (bauteile[i] as TBaugruppe).gibAnzahl else a := a+1; gibAnzahl := a;

Schichten-Architektur Benutzungsoberfläche Bauteile_U.pas Fachliches Modell Bauteile_Modell.pas

Auszug aus "Bauteile_U.pas" procedure TForm1.AbfrageClick(Sender: TObject); var bauteilNr: string; b: TBauteil; begin if BauteilListBox1.ItemIndex <> -1 then begin bauteilNr := BauteilListBox1.items [BauTeilListBox1.ItemIndex]; b := findeBauteil(bauteilNr); BauteilPreis.Text := IntToStr(b.gibPreis); if b is TElement then BauteilAnzahl.Text := '(keine)' else BauteilAnzahl.Text := IntToStr((b as TBaugruppe).gibAnzahl); end end;