Een introductie tot Object Georiënteerd Programmeren
Overerven
Een heel belangrijk onderdeel van OOP is het overerven. Ik heb het er al kort over gehad in de introductie. Het komt er in feite op neer dat men een basisklasse kan ontwerpen voor meerdere klassen. Er zijn ongelofelijk veel zoogdieren, ze delen allemaal bepaalde eigenschappen, maar er zijn ook genoeg verschillen. De gemeenschappelijke eigenschappen behoren in de basisklasse. De eigenschappen die bij een bepaald dier horen zet u in een afgeleide klasse. Voor de basisklasse wordt ook wel de term Parent(Ouder) gebruikt en voor de afgeleide klasse Child(Kind). Hier zien we een voorbeeld van een parent en child.
klasse ZoogDier
begin
	publiek
	
		methode Eet()
		begin
			// elk dier moet eten
		eind;
		
		methode Adem()
		begin
			// elk dier moet ademhalen
		eind;
eind;

klasse Olifant : ZoogDier
begin
	publiek
		methode Trompetteer()
		begin
			// Een olifant trompetteert :)
		eind;
eind;

Olifant Jumbo = nieuw Olifant;
Jumbo.Trompetteer();
Jumbo.Eet();
Jumbo.Adem();
verwijder Jumbo;


Hier zien we de basisklasse ZoogDier en de afgeleide klasse Olifant. Door Olifant af te leiden van de klasse ZoogDier, kunnen we de publieke methodes Adem en Eet aanroepen vanuit een instantie van Olifant. U kunt ook publieke variabelen van de klasse ZoogDier raadplegen(als ze bestonden). Privé methoden en variabelen zijn vanuit de klasse Olifant niet te bereiken. Wilt u variabelen en methoden toch afschermen van de buitenwereld en tergelijkertijd ervoor zorgen dat de methoden/variabelen aanspreekbaar zijn in een afgeleide klasse dan moet u de toegangsspecificate beschermd(Engels: protected) gebruiken. Hier een voorbeeld:
klasse Vogel
begin
	beschermd
		getal AantalWaarnemingen;
		string VogelNaam;
		
		methode Eet();
		begin
			// een vogel moet ook eten
		eind;
		
		methode Adem();
		begin
			// een vogel moet ademen
		eind;
		
	publiek
		constructor Vogel(string Naam)
		begin
			VogelNaam = Naam;
		eind;
		
		methode WaarGenomen()
		begin
			AantalWaarnemingen = AantalWaarnemingen + 1;
		eind;
eind;

klasse Meeuw : Vogel
begin
	publiek
		methode Leef()
		begin
			Eet(); // eet
			Adem(); // en haal adem
		eind;	
eind;

Meeuw Jan = nieuw Meeuw;
// Hey ik heb een meeuw gezien!
Jan.WaarGenomen();
Jan.Leef();
verwijder Jan;


VogelNaam en AantalWaarnemingen zijn afgeschermd van de buitenwereld en kunnen alleen in een instantie van Vogel of Meeuw worden opgevraagd. De afgeleide klasse meeuw heeft een methode Leef die Eet() en Adem() aanroept. Dit is volkomen legaal aangezien Eet() en Adem() beschermde methoden van Vogel zijn. Zouden deze methodes privé zijn, dan zou hier een fout optreden. De methode Leef() behoort niet tot de klasse Vogel.

(Bijna) elk dier beweegt zich voort, maar niet alle dieren doen dit op dezelfde manier. In OOP kunt u daarom de basis van het bewegen vastleggen in een methode, en in de afgeleide klassen deze methode uitbreiden:
klasse Dier
begin
	beschermd
		getal X;
		getal Y;	
		getal Z;
	publiek
		methode Beweeg(SnelheidX, SnelheidY, SnelheidZ)
		begin
			X = X + SnelheidX;
			Y = Y + SnelheidY;
			Z = Z + SnelheidZ;
		eind;
eind;

klasse Vogel : Dier
begin
	publiek
		methode BeweegVleugels()
		begin
			// Beweeg op en neer met de vleugels
		eind;
		
		methode Beweeg(SnelheidX, SnelheidY, SnelheidZ)
		begin
			BeweegVleugels();
			BasisKlasse.Beweeg(SnelheidX, SnelheidY, SnelheidZ);
		eind;
eind;

klasse Olifant : Dier
begin
	publiek
		methode Stamp()
		begin
			// Stamp op de grond
		eind;
		
		methode Beweeg(SnelheidX, SnelheidY, SnelheidZ)
		begin
			Stamp();
			BasisKlasse.Beweeg(SnelheidX, SnelheidY, SnelheidZ);
		eind;
eind;

Olifant Jumbo = nieuw Olifant;
Jumbo.Beweeg(100,0,0); // Beweeg 100 meter vooruit.
verwijder Jumbo;

Vogel Meeuw = nieuw Vogel();
Meeuw.Beweeg(10,0,10); // Beweeg 10 meter omhoog en naar voren.
verwijder Meeuw;


Hier ziet u hoe we de methodes overstemmen(Engels: to override), zo zal de methode BeweegVleugels() worden aangeroepen als u een vogel laat bewegen. En als u een olifant laat bewegen zal de methode Stamp worden aangeroepen. BasisKlasse.Beweeg() wordt gebruikt om de code in de methode Beweeg() van de basisklasse uit te voeren. De code van de basisklasse aanroepen is niet noodzakelijk.

Vorige - Volgende