Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Polymorphie Überschreiben

Ähnliche Präsentationen


Präsentation zum Thema: "Polymorphie Überschreiben"—  Präsentation transkript:

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

2 Definition

3 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.

4 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; }

5 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);

6 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

7 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); }

8 Methoden überschreiben

9 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;

10 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.

11 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.

12 Leih-Objekte Bibliothek

13 Das Klassendiagramm

14 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; }

15 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;

16 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

17 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

18 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);

19 Geometrische Figuren

20 Klassen-Diagramm

21 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);

22 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 }

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

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

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

26 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 }

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

28 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 }

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

30 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); }

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


Herunterladen ppt "Polymorphie Überschreiben"

Ähnliche Präsentationen


Google-Anzeigen