Er bestaan in objectgeoriënteerd programmeren meer manieren om effectief hergebruik van code te bereiken dan alleen associaties. Een andere manier is overerving. In dit hoofdstuk leggen we ons toe op dit concept.
Klassen kunnen gebaseerd zijn op, of afgeleid zijn van andere klassen. We spreken dan van subklassen en superklassen.
De klasse Car, bij voorbeeld, heeft bepaalde eigenschappen en gedragingen (methoden).
Er bestaan verschillende soorten auto’s. Zo hebben we terreinwagens, sportwagens, cabriolets, enzovoort. De auto kan dus onderverdeelt worden in subsoorten. Van elke subsoort kunnen we nu een afzonderlijke klasse maken. We spreken in dit geval van subklassen. Een terreinwagen is een auto maar wel een speciaal soort auto dat onderscheiden is van de sportwagen. Toch zijn het beide auto’s.
De klasse SUV is een subklasse van de superklasse Car.
Subklassen die zijn afgeleid van een superklasse erven alle eigenschappen en methoden van de superklasse over; ze voegen bovendien een aantal specifieke eigenschappen en methoden toe en kunnen zelfs de implementatie van bepaalde methoden gewoon vervangen (override).
De terreinwagen erft alle eigenschappen en methoden van de klasse auto over. Met een terreinwagen kan je rijden zoals je met iedere auto rijdt, omdat alle kenmerken en gedragingen (eigenschappen en methoden) dezelfde zijn als die van een gewone auto. Een terreinwagen heeft een bepaalde kleur, kan versnellen en remmen, kan draaien enzovoort.
Het concept van overerving in objectgeoriënteerd programmeren zorgt ervoor dat we de code kunnen hergebruiken (code reuse). De code wordt in een superklasse gemaakt en vervolgens hergebruikt in één of meerdere subklassen.
Tegelijkertijd voegt de klasse terreinwagen ook een aantal eigenschappen en methode toe die specifiek zijn voor de terreinwagen. Zo hebben we onder andere een 4×4 aandrijving, een kruipversnelling, een bull bar, enzovoort.
Subklassen kunnen ook bepaalde methoden vervangen (override).
Bij een gewone auto met verbrandingsmotor kunnen we de auto sneller doen rijden door op het gaspedaal te duwen. We roepen de methode accelerate() op. De implementatie hiervan bestaat in het inspuiten van meer brandstof in de cilinder.
Bij een elektrische auto blijft het gaspedaal hetzelfde, maar de actie die door de auto ondernomen wordt is anders. In plaats van meer brandstof in de cilinder te spuiten zal de elektronische snelheidsregelaar een hogere spanning of frequentie op de motor zetten.
De methode accelerate() wordt in beide gevallen aangeroepen maar de implementatie werd overschreven in het geval van de elektrische auto. De methode werd vervangen.
Bussen en vrachtwagens zijn net zoals onze auto ook voertuigen. Allemaal hebben ze een aantal gemeenschappelijke kenmerken. Zo kunnen we een superklasse Wegvoertuig abstraheren die een superklasse van auto, bus een vrachtwagen is, waaronder Terreinwagen een subklasse van Auto is. Zo verkrijgen we een complete hiërarchie van klassen waarbij de subklassen telkens de eigenschappen en methoden van de superklassen overerven en daarbij een aantal eigenschappen en methoden toevoegen of vervangen.
Zo is de methode accelerate() een methode van de klasse Voertuig maar ieder subklasse heeft een andere implementatie van deze methode. Een wegvoertuig versnelt anders dan een watervoertuig of luchtvoertuig.
Van de klasse Vehicle op zich bestaan er eigenlijk geen concrete objecten. Deze klasse definieert enkel een aantal eigenschappen en methoden die gemeenschappelijk zijn voor de subklassen. Daarom noemen we de Vehicle een abstracte klasse. Ze definieert op een abstracte manier hoe een voertuig in het algemeen eruit ziet. Voertuigen moeten bijvoorbeeld kunnen versnellen, vertragen, van richting veranderen enzovoort. Belangrijk is dat we voor de bepaalde voertuigobjecten vastleggen welke gedragingen ze zouden moeten kunnen vertonen.
Abstracte klassen worden dus gebruikt om algemene kenmerken en methoden voor een bepaald soort objecten te definiëren. Het is de bedoeling dat van abstracte klassen andere klassen worden afgeleid. Van deze afgeleide klassen worden dan uiteindelijk objecten gemaakt.