0%

Overerving en polymorfisme · oefening

Initialiseer subklassen met super()

Een subklasse zonder extra velden kan de constructor ongewijzigd erven. Tekstvragen en numerieke vragen hebben extra toestand nodig en definiëren daarom zelf __init__.

Het gedeelde deel moet nog steeds één keer worden geïnitialiseerd.

Roep de basisimplementatie aan

Try it

super() selecteert de basisimplementatie voor dit object. De subklasse geeft de gedeelde velden naar boven door en bewaart daarna alleen het eigen veld.

Zonder die aanroep herhaalt elke subklasse dit:

self.prompt = prompt
self.points = points

Die duplicatie is precies wat de basis moest verwijderen.

Waarom roep je super().__init__(prompt, points) aan?

Subklassen bewaren alleen hun verschillen

Nadat de basis prompt en points heeft geïnitialiseerd:

  • bewaart TextQuestion een antwoord;

  • bewaart ChoiceQuestion een juiste optie;

  • bewaart NumericQuestion een antwoord en een tolerantie.

Ze erven describe en overschrijven is_correct. Aanroepende code gebruikt nog steeds één protocol en vraagt nooit welke subklasse die ontving.

Een niet-numeriek antwoord legt hier nog steeds de onvoltooide gedragsafspraak van het numerieke subtype bloot. Les 8 behandelt die belofte voor de hele familie; deze oefening richt zich alleen op correcte initialisatie.

Refactor de drie gegeven klassen zodat elke gedeelde toewijzing uit de subklassen verdwijnt.

Opdracht

Refactor de drie vraagklassen zodat ze erven van Question.

De basis valideert een niet-lege prompt en niet-negatieve points, biedt describe() en heeft een tijdelijke is_correct(response) die NotImplementedError opgooit.

Elke subklasse definieert __init__, roept super().__init__(prompt, points) aan en bewaart alleen de eigen specifieke velden. Geen ervan mag gedeelde velden opnieuw toewijzen of describe opnieuw definiëren. Tekstantwoorden en keuzeopties moeten niet-leeg zijn; bewaar keuzeopties genormaliseerd. De numerieke tolerantie moet niet-negatief zijn.

Houd score_quiz ongewijzigd.