Polymorphie Überschreiben

Slides:



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

der Universität Oldenburg
der Universität Oldenburg
der Universität Oldenburg
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
der Universität Oldenburg
Abstrakte Klassen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Grundlagen der Objektorientierung
Abstrakte Klassen.
Erweiterte Zuweisungskompatibilität
Polymorphie (Vielgestaltigkeit)
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Programmieren mit JAVA
Programmieren mit JAVA
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Abstrakte Klassen DVG
C++ Vererbung und Polymorphie
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
Vererbung Einfache Vererbung – Erben von abstrakten Klassen – Implementieren eines Interfaces.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
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.
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Objektorientiertes Programmieren
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
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 Programmierung Wintersemester 2010/11 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Klassenhierarchien, Vererbung
EPROG Tutorium #6 Philipp Effenberger
EPROG Tutorium #5 Philipp Effenberger
Programmiervorkurs WS 2014/15 Instanzmethoden
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
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.
Java-Kurs - 6. Übung Besprechung der Hausaufgabe
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Java-Kurs - 6. Übung Besprechung der Hausaufgabe
Java-Kurs Übung Besprechung der Hausaufgabe Vererbung
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
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,
Abstrakte Klassen und das Interface-Konzept
Objektorientierte Programmierung (OOP)
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.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
© Tenbusch Oberstufenzentrum Informations- und Medizintechnik Objektorientierte Programmierung mit Java.
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
Vererbung.
„Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen.“
Venusspiegel und Marsschild
OOP II.
Einführung in die Programmierung mit Java
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
Programmierung und Vererbung in Java
Einführung in die Programmierung
Polymorphie Überladen
Interfaces Definition von Interfaces Verwendung von Interfaces
«Delegierter» Methoden Schablone Funktionszeiger
Definition Felder Konstruktor Methoden Beispiel
1. Die rekursive Datenstruktur Liste 1
Implementieren von Klassen
Grundkurs Informatik 11-13
 Präsentation transkript:

Polymorphie Überschreiben Definition Eigene Methoden überschreiben Beispiele Dr. Beatrice Amrhein

Definition

Vererbung Durch das Vererben von Klassen erhält die abgeleitete Klasse alle (für sie sichtbaren) Eigenschaften (Membervariablen und Methoden) der Basisklasse. Die Unterklasse kann zusätzliche Membervariablen und Methoden hinzufügen. Falls diese Methoden in der abgeleiteten Klasse anders heissen, oder eine andere Signatur haben, hat die abgeleitete Klasse ganz normale (oder ev. überladene) Methoden.

Definition: Überschreiben (von Methoden) Eine Methode kann in einer davon abgeleiteten Klasse überschrieben werden. Beim Überschreiben einer Methode müssen die beiden Methodensignaturen (Methodenname, Parameterliste, Rückgabewert) exakt(!) übereinstimmen. public class BasisKlasse { public virtual int MachEtwas(int a) { return a + a; } } public class AbgeleiteteKlasse:BasisKlasse public override int MachEtwas(int a) { return a * a; }

Definition: Überschreiben (von Methoden) Überschreiben der Methode Ausgabe public class BasisKlasse { public virtual void Ausgabe(string s) Console.WriteLine(s); } public class AbgeleiteteKlasse:BasisKlasse private int counter; public override void Ausgabe(string s) Console.WriteLine(s + ": " + counter);

Abstrakte Klassen und Methoden Eine Basisklasse kann die Implementation einer Methode für alle abgeleiteten Klassen erzwingen, ohne eine Basis-Methode zur Verfügung zu stellen. Dies geschieht durch das Schlüsselwort abstract. Die Basisklasse selber ist dann ebenfalls abstrakt, da nicht alle Methoden implementiert sind. Abstrakte Klassen können nicht erzeugt werden. public abstract class BasisKlasse { public abstract void Info(string s); public virtual void Ausgabe(string s) { Console.WriteLine(s); } } Muss in allen abgeleiteten Klassen überschrieben werden Kann in den abgeleiteten Klassen überschrieben werden

Abstrakte Klassen und Methoden Die abgeleiteten Klassen sind gezwungen, die Info-Methode zu überschreiben. Andernfalls sind sie ebenfalls abstract. public class Klasse1 : BasisKlasse { DateTime date; public override void Info(string s) // muss implementiert werden { Console.WriteLine(s + date.Year); } public override void Ausgabe(string s) // kann implementiert werden { Console.WriteLine(s + ": " + counter); } } public class Klasse2 : BasisKlasse public override void Info(string s) // muss implementiert werden { Console.WriteLine(s + date.Month + "." + date.Year); }

Methoden überschreiben

Virtual und Override Die Methode der Basisklasse welche durch die Methode der abgeleiteten Klasse überschrieben werden soll, muss dies durch das Schlüsselwort virtual zulassen public virtual int MachEtwas(int a) { return a + a; } Die Methode der abgeleiteten Klasse, welche die Methode der Basisklasse überschriebt, muss die gleiche Signatur haben und das Überschreiben durch das Schlüsselwort override anzeigen public override int MachEtwas(int a) return a * a;

Nicht überschriebene Methoden Virtuelle Methoden müssen nicht zwingend überschrieben werden. public class BasisKlasse { public virtual int MachEtwas(int a) { return a + a; } public virtual int MachEtwasAnderes(int a) { return 3 * a; } } public class AbgeleiteteKlasse:BasisKlasse public override int MachEtwas(int a) { return a * a; } Die abgeleitete Klasse kann, muss aber die virtuellen Methoden der Basis-Klasse nicht zwingend überschreiben. Fehlende, nicht überschriebene Methoden werden vererbt.

Benutzen von nicht überschriebenen Methoden static void Main(string[] args) { BasisKlasse b = new BasisKlasse(); Console.WriteLine("MachEtwas von BasisKlasse: {0}", b.MachEtwas(4)); AbgeleiteteKlasse a = new AbgeleiteteKlasse(); Console.WriteLine("MachEtwas von AbgeleiteteKlasse: {0}", a.MachEtwas(4)); Console.WriteLine("MachEtwasAnderes von AbgeleiteteKlasse: {0}", a.MachEtwasAnderes(4)); } MachEtwasAnderes wurde in der abgeleiteten Klasse nicht überschrieben, also erbt AbgeleiteteKlasse die Methode von der BasisKlasse.

Leih-Objekte Bibliothek

Das Klassendiagramm

BasisKlasse LeihObjekt mit Info Methode public class LeihObjekt { private int id; private String title; public static int counter = 0; protected LeihObjekt(String t) id = ++counter; title = t; Console.Write("LeihObjekt"); } public virtual String Info() // virtual  überschreiben ist möglich { return "\n" + id + ". " + title; }

Abgeleitete Klasse PrintMedium public class PrintMedium : LeihObjekt { private String verlag; private int seiten; public PrintMedium(String t, String p) : base(t) verlag = p; Console.Write("--> PrintMedium"); } public override String Info() // überschrieben von Klasse LeihObjekt return base.Info() + " des Verlags " + this.verlag; public virtual String Info(String s) // überladen, nicht überschrieben!!! { // überschreiben ist möglich return this.Info() + s + this.seiten;

Von PrintMedium abgeleitete Klasse Buch public class Buch : PrintMedium { private String autor; private Einband einband; public Buch(String t, String p, String a) : base(t, p) this.autor = a; Console.Write("--> Buch"); } public Buch(String t, String p, String a, Einband e) : this(t, p, a) { this.einband = e; } public override String Info() { return base.Info() + ", Autor: " + autor;} public override String Info(String s) { return this.Info() + s + this.einband;} // überladener Konstruktor // überschrieben von Klasse PrintMedium // überschrieben von Klasse PrintMedium

Von LeihObjekt abgeleitete Klasse DVD public class DVD : LeihObjekt { private String regisseur; private int laenge; public DVD(String t, String r) : base(t) regisseur = r; Console.Write("--> DVD"); } public DVD(String t, String r, int l) : this(t, r) { this.laenge = l; } public override String Info() { return base.Info() + ", Regisseur: " + regisseur; } public String Info(String s) { return this.Info() + s + this.laenge;} // überladener Konstruktor // überschrieben von Klasse LeihObjekt // überladen, nicht überschrieben

Benutzen der überschriebenen Methoden PrintMedium z = new PrintMedium("Das-Neue-Heft", "Hefti"); Console.WriteLine(z.Info()); Buch b = new Buch("Das-neue-Buch", "Bucher", "Schreiber", Einband.Moleskin); Console.WriteLine(b.Info(", Einband: ")); DVD d1 = new DVD("Der-neue-Film", "Reger", 122); Console.WriteLine(d1.Info(", Länge: ")); DVD d2 = new DVD("Der-zweite-neue-Film", "Filmer"); Console.WriteLine(d2.Info()); Console.WriteLine("Anzahl Leihobjekte: {0}", LeihObjekt.counter);

Geometrische Figuren

Klassen-Diagramm

Basisklasse für Geometrische Figuren public abstract class GeomFigur { protected int[] seiten; protected string message; protected static int counter; protected GeomFigur(int[] s) counter++; seiten = s; message += "GeomFigur"; } public virtual void ShowMessage() { MainWindow.ShowMessage(GeomFigur.counter, "Default Message"); } public abstract void Zeichne(MainWindow window); public abstract void Zeichne(MainWindow window, Brush b);

Klasse Polygon public class Polygon : GeomFigur { public Polygon(int[] s) : base(s) { base.message += " - Polygon"; } public virtual void ShowMessage() { MainWindow.ShowMessage(GeomFigur.counter, base.message); } public override void Zeichne(MainWindow window, Brush b) { window.DrawPolygon(seiten, b); } public override void Zeichne(MainWindow window) { this.Zeichne(window, Brushes.Yellow); } // Default-Farbe gelb }

Benutzen der Klasse Polygon int[] s1 = { 5, 3, 2 }; Polygon p = new Polygon(s1); p.Zeichne(window, Brushes.Red); p.ShowMessage();

Die Klasse Dreieck public class Dreieck : Polygon { public Dreieck(int[] s) : base(s) { message += " - Dreieck"; } }

Benutzen der Klasse Dreieck int[] s1 = { 5, 3, 2 }; Dreieck d = new Dreieck(s1); d.Zeichne(window); d.ShowMessage();

Die Klasse Rechteck } public class Rechteck : GeomFigur { protected Rechteck(int[] s) : base(s) { base.message += " - Rechteck"; } public override void Zeichne(MainWindow window, Brush b) { window.DrawRectancle(base.seiten[0], base.seiten[1], b); } public override void Zeichne(MainWindow window) { this.Zeichne(window, Brushes.Green); } // Default-Farbe grün }

Benutzen der Klasse Rechteck int[] s1 = { 5, 3, 2 }; Rechteck r = new Rechteck(s1); r.Zeichne(window); r.Zeichne(window, Brushes.Violet); r.ShowMessage();

Die Klasse Ellipse public class Ellipse : GeomFigur { protected Ellipse(int[] s) : base(s) { base.message += " - Ellipse"; } public override void Zeichne(MainWindow window, Brush s) { window.DrawEllipse(base.seiten[0], base.seiten[1], b); } public override void Zeichne(MainWindow window) { this.Zeichne(window, Brushes.Blue); } // Default-Farbe blau }

Benutzen der Klasse Ellipse int[] s1 = { 5, 3, 2 }; Ellipse e = new Ellipse(s1); e.Zeichne(window, Brushes.Chocolate); e.ShowMessage();

Die Klasse Kreis protected Kreis(int[] s) base(s) public class Kreis : Ellipse { protected Kreis(int[] s) base(s) base.message += " - Kreis"; base.seiten[1] = s[0]; } public override void ShowMessage() { MainWindow.ShowMessage(GeomFigur.counter, base.message); }

Benutzen der Klasse Kreis int[] s1 = { 5, 3, 2 }; Kreis k = new Kreis(s1); k.Zeichne(window); k.ShowMessage();