![]() |
![]() |
![]() |
![]() |
Vererbung kennst du aus Bio (Stammbaum der Artverwandschaften) oder aus dem täglichen Leben (dein Stammbaum). Und diese Idee der Vererbung kann man fürs Programmieren nutzen! Grundlegend für die Vererbung ist die Eltern-Kind-Relation: 'irgendwie' werden Eigenschaften von den Eltern auf das Kind vererbt. Was könnte man beim Programmieren vererben? Ganz einfach: Eine Klasse besteht aus Methoden und Eigenschaften und die können vererbt werden! An dieser Stelle die zentrale Frage: Welche Eigenschaften gibt es in der Klasse Bankkonto
(siehe bank.py)?
______________________________________________________
Und welche Methoden stellt die Klasse
Bankkonto
zur Verfügung?
______________________________________________________
______________________________________________________
______________________________________________________
In Python funktioniert Vererbung so: Eine Klasse kann mehrere Kinder haben, man sagt hier Subklassen, und eine Subklasse kann mehrere Eltern haben! Die Elternklasse(n) nennt man auch Superklasse(n), manche sprechen an dieser Stelle auch gerne von Vorgänger und Nachfolger. Und wie sagt man Python, dass eine Klasse eine andere beerben soll? So:
class Taschengeld(Bankkonto):
Du siehst: unsere Bankkonto-Klasse (Elternklasse!) kommt hinter dem Namen der Kindklasse in Klammern, schauen wir uns ein Beispiel an . . .
class Taschengeld(Bankkonto): """Taschengeld-Konto: man darf nicht ueberziehen . . .""" def __init__(self,startbetrag): """Konstruktor: erzeugt Taschengeldkonto""" # rufe Konstruktor aus Bankkonto-Klasse auf Bankkonto.__init__(self,startbetrag) def auszahlung(self, betrag): if ((self.kontostand - betrag) < 0.0): print "ERROR!! DU darfst nicht ueberziehen! ERROR!!" else: self.kontostand = self.kontostand - betrag
Beachte die Einrückungen! Zur Erklärung:
class Taschengeld(Bankkonto):
Hier beginnt die Klassenvereinbarung, der Name der Elternklasse wird "einfach" als Parameter übergeben!
__init__
. Der Konstruktor ruft wiederum den Konstruktor der Elternklasse aufBankkonto.__init__(self,startbetrag)
self
?auszahlung(self,betrag)
gibt es auch in der Elternklasse (schau nach), da man aber bei einem Taschengeld-Konto nicht überziehen darf, müssen wir diese Methode verändern, man sagt: wir überschreiben die Methode auszahlung
der Elternklasse. Frage: was ist mit den anderen Methoden, können wir sie benutzen? Wie?
Fehlermeldungen gibt es beim Ausführen von taschengeld.py
öfters, Beispiel:
Traceback (most recent call last): File "C:\lw_f\py_prg\oops_intro\bankkonto_python\taschengeld.py", line 6, in ? class Taschengeld(Bankkonto): NameError: name 'Bankkonto' is not defined
Überlege, wie du diesen Fehler vermeiden kannst . . .
<<<UML steht für Unified Modeling Language, zu Deutsch etwa eine Beschreibungssprache für Klassen (sehr frei übersetzt!). Beispiel:
Bankkonto |
self.kontostand |
constructor Bankkonto(startbetrag) method einzahlung(betrag) auszahlung(betrag) anzeigen() |
Klassen (und Objekte) werden in UML durch Rechtecke dargestellt: in der ersten Zeile steht der Name der Klasse, hier also Bankkonto
, in der zweiten Zeile werden die Eigenschaften aufgezählt, und da es in unserer Klasse nur eine Variable kontostand
gibt, steht hier auch nur eine Eigenschaft. In der dritten Zeile finden wir die Methoden (oder Funktionen) der Klasse Bankkonto: einzahlung
,
auszahlung
und anzeigen
, sowie den Konstruktor.
In UML kann man auch Vererbung und das Überschreiben von Methoden darstellen, wobei links jeweils die Superklassen und rechts die Unterklassen stehen:
|
← |
|
Aufgabe: Welche Methoden werden hier überschrieben?
____________________________________________________
findest du im Lehrer-Ordner rechts oben auf dem Desktop unter wspiegel u. s. w.:
Dispokonto
und überlege, welche Methoden du überschreiben musst. Kannst du Methoden unverändert übernehmen? Welche? Brauchst du neue Eigenschaften? Welche? (abspeichern unter dispo.py
)
self.inhaber
Dispokonto
, ergänzt um den
Kontoinhaber und stelle sie als UML-Diagramm dar!