0%

Overerving en polymorfisme · oefening

Gebruik duck typing

Polymorfisme vereiste in de vorige les geen overerving. De lus gaf er alleen om dat elk object dezelfde bewerking ondersteunde.

Dat is Pythons alledaagse stijl: gebruik een object op basis van wat het kan doen.

Een gedeeld protocol zonder basisklasse

Try it

De klassen zijn niet verwant. De lus heeft nog steeds een afspraak:

  • prompt kan worden gelezen;

  • points kan worden gelezen;

  • is_correct(response) geeft een booleaanse waarde terug.

Zo’n reeks verwachte bewerkingen wordt vaak een protocol genoemd. De objecten hoeven niet te verklaren dat ze eraan voldoen.

Waarom kan de lus beide niet-verwante klassen gebruiken?

De traditionele uitdrukking luidt: als een object loopt als een eend en kwaakt als een eend, kan code het als een eend behandelen. Lees dat in de praktijk als: vraag om het gedrag dat je nodig hebt, niet om de stamboom.

Overerving wordt nuttig wanneer klassen ook betekenisvolle implementatie herhalen. De volgende twee lessen verkennen eerst een optionele mogelijkheid en introduceren daarna pas een basis waar gedeelde code die rechtvaardigt.

De oefening bouwt drie niet-verwante objecten en een rapport dat nooit naar hun typen vraagt. Een vierde type dat de beoordelaar bedenkt moet werken zonder dat het rapport verandert.

Opdracht

Schrijf drie niet-verwante klassen die één rapportfunctie op dezelfde manier kan gebruiken.

TextQuestion, ChoiceQuestion en SurveyItem bieden elk prompt, points en is_correct(response). De enquête is 0 waard en elk antwoord telt als juist.

Schrijf report(items, responses), dat per item één regel "<prompt>: correct" of "<prompt>: incorrect" teruggeeft, gevolgd door "Total: <points>".

Het rapport mag niet vragen welke klasse een item heeft. Een nieuw type dat hetzelfde protocol biedt moet ongewijzigd werken.