<== Zur Übersicht der Begriffe ==>
Von Überschreiben einer Methode spricht man, wenn in einer erbenden Klasse eine Methode [mit derselben Signatur*)] wie in der vererbenden Klasse [Oberklasse] existiert.
Für alle Instanzen der vererbenden Klasse ersetzt die überschreibende Methode die überschriebene.
Das hat zur Folge, dass auch für Methodenaufrufe von Methoden, die in der Oberklasse beschrieben sind, nicht auf die Methode der Oberklasse, sondern auf die überschreibende Methode zugegriffen wird.
Auf die besondere Bedeutung des Überschreibens bei der Vererbung lesen Sie dort und unter Polymorphie nach.
Wichtig zu beachten: Werden in einer erbenden Klasse Variable mit demselben Namen wie Variablen aus der vererbenden Klass deklariert, dann überschreiben sie nicht die Variablen der vererbenden Klasse, sondern sie überdecken sie.
*) Siehe dazu auch Overload
Für das Überschreiben:
Das Beispielprojekt enthält drei einfache Klassen zum Zählen. Die Oberklasse Zaehler enthält eine einfache Zählmethode, die jeweils um 1 weiterzählt, während die beiden von ihr erbenden Klassen VielZaehler und OderSoZaehler diese Methode durch eine eigene mit veränderbarer Weite überschreiben.
class Zaehler(object): '''Erben von object notwendig wegen super''' def __init__(self): """Konstruktor von Zaehler initialisiert die Instanzvariable __stand von Zaehler""" self.__stand = 0 def GibStand(self): """Get-Methode fuer den Stand""" return self.__stand def Zaehle(self): """Veraendernde Methode fuer den Stand. Diese Methode wird von der erbenden Klasse ueberschrieben.""" self.__stand += 1
class VielZaehler(Zaehler): def __init__(self): """Konstruktor von VielZaehler""" Zaehler.__init__(self) def Zaehle(self, wieviel=10): """Veraendernde Methode fuer den Stand. Diese Methode ueberschreibt Zaehle() von Zaehler.""" self._Zaehler__stand += wieviel
class OderSoZaehler(Zaehler): def __init__(self): """Konstruktor von OderSoZaehler""" Zaehler.__init__(self) def Zaehle(self, wieviel=10): """Veraendernde Methode fuer den Stand. Diese Methode ueberschreibt Zaehle() von Zaehler, verwendet aber diese Methode.""" for i in range(wieviel): super(OderSoZaehler, self).Zaehle()
mit den Aufrufen
zaehler=Zaehler() print zaehler.GibStand() zaehler.Zaehle() print zaehler.GibStand() print vielZaehler=VielZaehler() print vielZaehler.GibStand() vielZaehler.Zaehle() print vielZaehler.GibStand() vielZaehler.Zaehle(5) print vielZaehler.GibStand() print oderSoZaehler=OderSoZaehler() print oderSoZaehler.GibStand() oderSoZaehler.Zaehle() print oderSoZaehler.GibStand() oderSoZaehler.Zaehle(5) print oderSoZaehler.GibStand()
und den Ausgaben
0 1 0 10 15 0 10 15
Die beiden verschiedenen Methoden zur Ausgabe in der folgenden "Lösung" zeigen, dass zwei verschiedene Variablen angelegt wurden und die in der erbenden Klasse die aus der vererbenden Klasse überdeckt, was hier sicherlich nicht beabsichtigt war.
class Zaehler(object): '''Erben von object notwendig wegen super''' def __init__(self): """Konstruktor von Zaehler initialisiert die Instanzvariable __stand von Zaehler""" self.__stand = 0 def GibStand(self): """Get-Methode fuer den Stand""" return self.__stand def Zaehle(self): """Veraendernde Methode fuer den Stand. Diese Methode wird von der erbenden Klasse ueberschrieben.""" self.__stand += 1
class ZehnZaehler(Zaehler): def __init__(self): """Konstruktor von ZehnZaehler initialisiert die Instanzvariable __stand von Zaehler""" Zaehler.__init__(self) self.__stand = 0 def Zaehle(self): """Veraendernde Methode fuer den Stand. Diese Methode ueberschreibt Zaehle() von Zaehler.""" self.__stand += 10 def ZaehleSuper(self): """Veraendernde Methode fuer den Stand. Diese Methode Diese Methode ruft Zaehle() von Zaehler auf, ein direkter Zugriff aus ZehnZaehler ist unmoeglich.""" super(ZehnZaehler, self).Zaehle() def GibStandInZehnZaehler(self): """Get-Methode fuer den Stand""" return self.__stand
Testaufrufe
zehnZaehler1 = ZehnZaehler(); print zehnZaehler1.GibStand(); print zehnZaehler1.GibStandInZehnZaehler(); zehnZaehler1.Zaehle(); print zehnZaehler1.GibStand(); print zehnZaehler1.GibStandInZehnZaehler(); zehnZaehler1.Zaehle(); print zehnZaehler1.GibStand(); print zehnZaehler1.GibStandInZehnZaehler(); zehnZaehler1.ZaehleSuper(); print zehnZaehler1.GibStand(); print zehnZaehler1.GibStandInZehnZaehler(); zehnZaehler1.Zaehle(); print zehnZaehler1.GibStand(); print zehnZaehler1.GibStandInZehnZaehler(); zehnZaehler1.ZaehleSuper(); print zehnZaehler1.GibStand(); print zehnZaehler1.GibStandInZehnZaehler();
Ausgabe
0 0 0 10 0 20 1 20 1 30 2 30
© Claus Albowski