0%

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

Try it

Die Klassen sind nicht miteinander verwandt. Die Schleife hat dennoch einen Vertrag:

  • prompt lässt sich lesen.

  • points lä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.