Overerving (informatica)

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

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.

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 bepaald. 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 buiten, 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" die op zichzelf zijn eigenschappen en methodes overerft aan 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 voor en 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'.

Een stukje terminologie. De klasse "Dier" 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 wordt polymorfisme genoemd. Bij klassen die erven van "Zoogdier" kan zelfs het geluid worden opgevraagd.

Soorten overerving[bewerken]

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