Vererbung und Polymorphie · Übung
Duck Typing verwenden
Polymorphie brauchte in der vorherigen Lektion keine Vererbung. Die Schleife verlangte nur, dass jedes Objekt denselben Vorgang bereitstellt.
Das ist alltäglicher Python-Stil: Verwende ein Objekt anhand dessen, was es kann.
Ein gemeinsames Protokoll ohne Basisklasse
Die Klassen sind nicht miteinander verwandt. Die Schleife hat dennoch einen Vertrag:
promptlässt sich lesen.pointslässt sich lesen.is_correct(response)gibt einen booleschen Wert zurück.
Eine solche Sammlung erwarteter Vorgänge heißt oft Protokoll. Die Objekte müssen nicht ausdrücklich erklären, dass sie es einhalten.
Warum kann die Schleife beide nicht verwandten Klassen verwenden?
Der traditionelle Spruch lautet: Wenn ein Objekt wie eine Ente läuft und wie eine Ente quakt, darf Code es wie eine Ente behandeln. Praktisch bedeutet das: Frage nach dem benötigten Verhalten, nicht nach dem Stammbaum.
Vererbung wird nützlich, wenn Klassen außerdem sinnvolle Implementierung wiederholen. Die nächsten beiden Lektionen betrachten zunächst eine optionale Fähigkeit und führen dann nur dort eine Basis ein, wo sich gemeinsamer Code lohnt.
Die Übung baut drei nicht verwandte Objekte und einen Bericht, der niemals nach ihren Typen fragt. Ein vierter Typ aus der Bewertung muss funktionieren, ohne den Bericht zu ändern.
Aufgabe
Schreibe drei nicht verwandte Klassen, die eine Berichtsfunktion auf dieselbe Weise verwenden kann.
TextQuestion, ChoiceQuestion und SurveyItem bieten jeweils prompt, points und is_correct(response). Die Umfragefrage ist 0 Punkte wert, und jede Antwort gilt als richtig.
Schreibe report(items, responses), das pro Element eine Zeile "<prompt>: correct" oder "<prompt>: incorrect" und anschließend "Total: <points>" zurückgibt.
Der Bericht darf nicht nach der Klasse eines Elements fragen. Ein neuer Typ mit demselben Protokoll muss unverändert funktionieren.