Vererbung und Polymorphie · Übung
Eine Basisklasse erstellen
Duck Typing braucht keinen Stammbaum. Vererbung wird nützlich, wenn mehrere tatsächliche Unterarten außerdem sinnvolle Implementierung wiederholen.
Gemeinsame Arbeit in eine Basis legen
Die Klammern in class SurveyQuestion(Question) sagen: Eine Umfragefrage ist eine Frage. Sie erbt __init__ und describe und liefert dann die eine abweichende Regel.
Die Basis formuliert den gemeinsamen Vertrag
Question.is_correct löst NotImplementedError aus. Ein Aufruf auf einem einfachen Question macht die fehlende Entscheidung sichtbar. Jede konkrete Unterklasse muss die Methode ersetzen.
Was erbt SurveyQuestion hier?
Vererbung nur für eine echte Unterart verwenden
Der Satz „Eine Umfragefrage ist eine Frage“ stimmt, und der gemeinsame Code ist tatsächlich vorhanden. Beide Bedingungen sind wichtig.
Ein Zeitlimit ist keine Art von Frage. Es ist etwas, das eine Frage hat. Mit TimeLimit(Question) entstünde ein Stammbaum, der die Domäne nicht beschreibt.
Diese erste Vererbungslektion verwendet bewusst Unterklassen ohne zusätzliche Konstruktorfelder. Die nächste Lektion führt super() für Unterklassen mit eigenem zusätzlichem Zustand ein.
Die Übung baut eine Basis und zwei kleine konkrete Arten. Jede Unterklasse soll nur ihre eigene Richtigkeitsregel enthalten.
Aufgabe
Schreibe eine Basisklasse Question, die einen nicht leeren prompt und nicht negative points hält. Umfragefragen dürfen null Punkte wert sein. Lehne eine ungültige Erzeugung mit ValueError ab. Ihr describe() gibt "<prompt> (<points> points)" zurück, und ihr is_correct(response) löst NotImplementedError aus.
Schreibe zwei Unterklassen ohne eigene Konstruktoren:
SurveyQuestiongibt immerTruezurück.RequiredResponseQuestiongibt zurück, ob die Antwort nach dem Entfernen von Leerraum an den Rändern nicht leer ist.
Beide Unterklassen erben __init__ und describe. Sie sollen nur is_correct definieren.