Overerving (informatica)

informatica

Overerving is een term die gebruikt wordt bij de methodiek van het object-georiënteerd programmeren. Het betekent dat een klasse variabelen (eigenschappen) en - afhankelijk van de definitie van de programmeertaal voor methodes - functies en procedures erft van een superklasse.

Soorten overerving bewerken

Men kan een onderscheid maken tussen "implementatie-overerving" en "blauwdrukovererving" (interface inheritance). Het verschil is dat bij de laatste variant alleen de definitie overgeërfd wordt, en niet de implementatie daarvan. Om objectgerichtheid, en in het bijzonder polymorfisme, echt goed tot zijn recht te laten komen, is dat laatste van belang. In plaats van implementatie-overerving kunnen in dat geval inbedding en delegatie als alternatief toegepast worden.

Voorbeeld bewerken

Als superklasse kan bijvoorbeeld "Dier" genomen worden. Een van de eigenschappen van een "Dier" is de vorm; de vorm wordt bepaald door de DNA-code van het dier. Bij het aanmaken van het dier wordt de DNA-code vastgelegd. De DNA-code kan bepaald worden door het afnemen van bloed: voor het gemak geeft een functie met de naam "bloed" de DNA-code van het dier.

De klasse zou er als volgt uit kunnen zien:

klasse Dier {
     constante DNAcode;
    
     constructor Dier(DNA) {DNAcode = DNA} // maakt het dier aan.
     methode bloed():DNAcode // geeft DNA code af door middel van bloed
}

Dieren reageren ook op prikkels van buitenaf, dus zou aan deze klasse ook een methode met de naam "prikkel" toegevoegd kunnen worden die een variabele waarde van de klasse binnenkrijgt en verwerkt.

klasse Dier {
    constante DNAcode
    
    constructor Dier(DNA) {DNAcode = DNA} // maakt het dier aan.
    methode bloed():DNAcode // geeft DNA code af door middel van bloed
    methode prikkel(Prikkel) // geeft een prikkel aan het dier
}

Door over te erven van de klasse "Dier" worden alle eigenschappen en methodes van die klasse overgenomen. Dit maakt het mogelijk om nieuwe diersoorten te maken die allemaal een DNA-code hebben en prikkels kunnen verwerken. De programmeur kan een nieuwe diersoort een unieke DNA-code geven en het op een andere manier laten reageren op een prikkel dan is voorgeschreven in de superklasse "Dier".

Een voorbeeld van een klasse die erft van "Dier" is een klasse "Zoogdier" waarvan de eigenschappen en methodes op haar beurt worden overgeërfd door een klasse "Olifant".

klasse Zoogdier (Dier) {
    variabele Geluid = 'zzzz';
    constructor Zoogdier(DNA) { super(DNA) } 
    methode maakGeluid():Geluid { return Geluid } // geeft het geluid van een Zoogdier
}

klasse Olifant (Zoogdier) {
    variabele Geluid = 'Muuuh'
    constructor Olifant { super('GCTTGGACCGTCGATGA') }
    methode stamp() // laat een Olifant stampen
}

De "Zoogdier"-klasse neemt alle methodes en eigenschappen van "Dier" over en voegt er eigen methodes en eigenschappen aan toe. De "Olifant"-klasse overschrijft alleen de variabele "Geluid"; alle andere methodes en toegankelijke eigenschappen van de klasse neemt hij over van zijn superklasse(n). Als het geluid van een "Olifant" wordt opgevraagd wordt dus het geluid "Muuuh" teruggegeven in plaats van het standaardgeluid "zzzz".

De klasse "Dier" is hier een generalisatie van "Zoogdier". De klasse "Zoogdier" is een specialisatie van "Dier". Het verschijnsel overerving wordt daarom ook wel specialisatie genoemd.

Door overerving goed toe te passen is het dus mogelijk om van alle wezens die uiteindelijk eigenschappen erven van de superklasse "Dier" de DNA-code te krijgen en ze een prikkel toe te sturen. Dit heet polymorfisme. Bij klassen die erven van "Zoogdier" kan zelfs het geluid worden opgevraagd.