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
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
TextQuestioneen antwoord;bewaart
ChoiceQuestioneen juiste optie;bewaart
NumericQuestioneen 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.