Overerving en polymorfisme · oefening
Gebruik optionele mogelijkheden van objecten
Een protocol zegt wat elk object moet bieden. Soms kan één object iets extra’s aanbieden zonder dat het voor alle objecten een vereiste wordt.
Een meerkeuzevraag kan het antwoord uitleggen. Een enquête-item heeft niets nuttigs uit te leggen.
Vraag of een mogelijkheid bestaat
Pythons hasattr(object, name) meldt of een attribuut of methode beschikbaar is:
Een rapport kan de mogelijkheid gebruiken als die aanwezig is:
if hasattr(item, "explain"):
lines.append(item.explain())
Het vraagt nog steeds niet of het object een ChoiceQuestion is. Een toekomstig type kan explain bieden en automatisch dezelfde behandeling krijgen.
Waarom controleer je op explain in plaats van op ChoiceQuestion?
Houd de kernafspraak klein
Optionele mogelijkheden zijn alleen nuttig rond een stevig verplicht protocol. Als is_correct optioneel was, kon het rapport de hoofdtaak niet uitvoeren.
Gebruik dit onderscheid:
verplicht gedrag maakt het object überhaupt bruikbaar;
optioneel gedrag verrijkt één gebruik als het beschikbaar is.
Strooi geen hasattr rond om het ontwerpen van een afspraak te vermijden. Gebruik het voor echt optionele toevoegingen waarvan de afwezigheid een duidelijke, gewone betekenis heeft.
De oefening begint met het werkende rapport op basis van duck typing en voegt één optionele uitleg toe zonder een concrete klasse te noemen.
Opdracht
Geef ChoiceQuestion een methode explain() die de reden teruggeeft.
Werk report(items, responses) bij zodat de uitleg van een item op een eigen regel direct na de uitkomst van dat item verschijnt, uitsluitend wanneer het object explain biedt.
Gebruik hasattr; controleer niet op een concrete klasse. Het verplichte protocol met prompt, points en is_correct blijft ongewijzigd.