Vererbung und Polymorphie · Übung
Unterklassen mit super() initialisieren
Eine Unterklasse ohne zusätzliche Felder kann ihren Konstruktor unverändert erben. Text- und Zahlenfragen brauchen weiteren Zustand und definieren daher selbst __init__.
Der gemeinsame Teil muss trotzdem einmal initialisiert werden.
Die Basisimplementierung aufrufen
super() wählt für dieses Objekt die Basisimplementierung. Die Unterklasse gibt die gemeinsamen Felder nach oben weiter und speichert anschließend nur ihr eigenes Feld.
Ohne diesen Aufruf wiederholt jede Unterklasse:
self.prompt = prompt
self.points = points
Genau diese Wiederholung sollte die Basis entfernen.
Warum super().__init__(prompt, points) aufrufen?
Unterklassen behalten nur ihre Unterschiede
Nachdem die Basis prompt und points initialisiert hat:
speichert
TextQuestioneine erwartete Antwort;speichert
ChoiceQuestioneine richtige Option;speichert
NumericQuestioneine erwartete Antwort und eine Toleranz.
Sie erben describe und überschreiben is_correct. Aufrufender Code verwendet weiterhin ein Protokoll und fragt nie, welche Unterklasse er erhalten hat.
Eine nicht numerische Antwort legt hier weiterhin die noch unvollständige Verhaltenszusage des numerischen Untertyps offen. Lektion 8 behandelt diese familienweite Zusage. Diese Übung konzentriert sich auf die korrekte Initialisierung.
Strukturiere die drei vorgegebenen Klassen so um, dass alle gemeinsamen Zuweisungen aus den Unterklassen verschwinden.
Aufgabe
Strukturiere die drei Frageklassen so um, dass sie von Question erben.
Die Basis validiert einen nicht leeren prompt und nicht negative points, bietet describe() und besitzt einen Platzhalter is_correct(response), der NotImplementedError auslöst.
Jede Unterklasse definiert __init__, ruft super().__init__(prompt, points) auf und speichert nur ihre eigenen Felder. Keine darf gemeinsame Felder erneut zuweisen oder describe neu definieren. Erwartete Textantworten und Auswahloptionen dürfen nicht leer sein. Speichere Auswahloptionen normalisiert. Die numerische Toleranz darf nicht negativ sein.
Lass score_quiz unverändert.