0%

Overerving en polymorfisme · oefening

Maak een basisklasse

Duck typing heeft geen stamboom nodig. Overerving wordt nuttig als meerdere werkelijke soorten ook betekenisvolle implementatie herhalen.

Zet gedeeld werk in een basis

Try it

De haakjes in class SurveyQuestion(Question) zeggen dat een enquêtevraag een vraag is. Die erft __init__ en describe en levert vervolgens de ene regel die verschilt.

De basis legt de gedeelde afspraak vast

Question.is_correct gooit NotImplementedError op. De methode op een kale Question aanroepen maakt de ontbrekende beslissing zichtbaar. Elke concrete subklasse moet die vervangen.

Wat erft SurveyQuestion hier?

Gebruik overerving alleen voor een werkelijke soort

De zin ‘een enquêtevraag is een vraag’ klopt en de gedeelde code is echt. Beide voorwaarden doen ertoe.

Een tijdslimiet is geen soort vraag; het is iets wat een vraag heeft. TimeLimit(Question) maken zou een stamboom opleveren die het domein niet beschrijft.

Deze eerste les over overerving gebruikt bewust subklassen die geen extra constructorvelden nodig hebben. De volgende les introduceert super() voor subklassen die eigen toestand toevoegen.

De oefening bouwt één basis en twee kleine concrete soorten. Elke subklasse hoort alleen de eigen afwijkende juistheidsregel te bevatten.

Opdracht

Schrijf een basisklasse Question met een niet-lege prompt en niet-negatieve points (enquêtevragen mogen nul waard zijn). Weiger ongeldig aanmaken met ValueError. De describe() geeft "<prompt> (<points> points)" terug en de is_correct(response) gooit NotImplementedError op.

Schrijf twee subklassen zonder eigen constructors:

  • SurveyQuestion geeft altijd True terug;

  • RequiredResponseQuestion geeft terug of het antwoord na het verwijderen van witruimte aan de uiteinden niet-leeg is.

Beide subklassen erven __init__ en describe. Ze horen alleen is_correct te definiëren.