Vererbung & UML



Vererbung

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:

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

UML steht fur Unified Modeling Language, zu Deutsch etwa eine Beschreibungssprache fur Klassen (sehr frei ubersetzt!). 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:

Bankkonto
self.kontostand
constructor
Bankkonto(startbetrag)
method
einzahlung(betrag)
auszahlung(betrag)
anzeigen()
    ←    
Taschengeld
 
constructor
Taschengeld(startbetrag)
method
auszahlung(betrag)
 
 



Beispiele

findest du unter dem Link Beispiele:


Aufgaben

  1. Lade das Beispiel taschengeld.py in dein Verzeichnis und probiere es aus!

  2. Schreibe folgende Erweiterung der Bankkonto-Klasse: In einem Dispokonto darfst du bis zu einer bestimmten Grenze überziehen. Schreibe per Vererbung die Klasse Dispokonto und überlege, welche Methoden du überschreiben musst. Kannst du Methoden unverändert übernehmen? Welche? Brauchst du neue Eigenschaften? Welche? (abspeichern unter dispo.py)

  3. Ergänze deine Bankkonto-Klasse(n) um den Kontoinhaber:

    self.inhaber

    Wie kann man auf diese Eigenschaft zugreifen und wo wird sie wie festgelegt?

  4. Die UML-Aufgabe: wähle deine Klasse Dispokonto, ergänzt um den Kontoinhaber und stelle sie als UML-Diagramm dar!

  5. Gegeben ist folgendes UML-Diagramm einer Klasse DirList (dirlist.py).

    DirList
    self.DirListe
    self.DirMax
    constructor
    DirList()
    method
    listLength()
    addEntry(element)
    swapFirst(element)
    delEntry(element)
    printList()
    resetList()


    Die Klasse verwaltet eine Liste von zuletzt geöffneten Dateien. Ergänze die fehlende Methode swapFirst. Aufgabe dieser Methode: sie setzt den Parameter "element" an den Anfang der DirListe (Hilfe gibt es hier: gfsqlite).

    6. Schau' mal nach UML im Internet!


    → sp, , 2016-12-09