Een introductie tot Object Georiënteerd Programmeren
Polymorfisme
Polymorfisme(Engels: Polymorphism) houdt in dat u een variabele gedeclareerd als object van een basisklasse kunt gebruiken om naar instanties van een afgeleide klasse te verwijzen. Klinkt deze zin ingewikkeld? Kijkt u dan eens naar het voorbeeld hieronder, het zal een hoop ophelderen.
klasse Vogel
begin
	beschermd
		getal AantalWaarnemingen;
		string Naam;		
	publiek
		constructor Vogel(string Naam)
		begin
			AantalWaarnemingen = 0;
			VogelNaam = Naam;
		eind;
		
		methode WaarGenomen()
		begin
			AantalWaarnemingen = AantalWaarnemingen + 1;
		eind;

		methode MaakGeluid()
		begin
			// Maak geluid
		eind;
eind;

klasse Meeuw : Vogel
begin
	publiek
		methode Krijs()
		begin
			// Een meeuw die krijst.
		eind;	
		
		methode MaakGeluid()
		begin
			Krijs();
		end;
eind;

// een object van een basisklasse kan 
// naar een afgeleide klasse wijzen:
Vogel Jan = nieuw Meeuw("Jan"); 
// Hey ik heb een meeuw gezien!
Jan.WaarGenomen();
// Maak geluid
Jan.MaakGeluid();
verwijder Jan;


Omdat Jan gedeclareerd is als Vogel, kan hij geen aanspraak maken op variabelen in of methodes aanroepen van Meeuw. Jan.MaakGeluid() zal de methode MaakGeluid van Vogel aanroepen en niet die van Meeuw. Hierop heeft men wat bedacht: virtuele methoden(Engels: virtual methods).
klasse Vogel
begin
	beschermd
		getal AantalWaarnemingen;
		string Naam;		
	publiek
		constructor Vogel(string Naam)
		begin
			AantalWaarnemingen = 0;
			VogelNaam = Naam;
		eind;
		
		methode WaarGenomen()
		begin
			AantalWaarnemingen = AantalWaarnemingen + 1;
		eind;

		virtuele methode MaakGeluid()
		begin
			// Maak geluid
		eind;
eind;

klasse Meeuw : Vogel
begin
	publiek
		methode Krijs()
		begin
			// Een meeuw die krijst.
		eind;	
		
		methode MaakGeluid()
		begin
			Krijs();
		end;
eind;

// een object van een basisklasse kan 
// naar een afgeleide klasse wijzen:
Vogel Jan = nieuw Meeuw("Jan"); 
// Hey ik heb een meeuw gezien!
Jan.WaarGenomen();
// Krijs!
Jan.MaakGeluid();
verwijder Jan;


Als u nu Jan.MaakGeluid() aanroept zal wel de methode in Meeuw worden aangeroepen, omdat de methode MaakGeluid() in de basisklasse een virtuele is. Nu zult u de meeuw wel horen krijsen!

U kunt een basisklasse abstract maken. Dit houdt in dat u geen instanties kunt aanmaken van die basisklasse. U moet dus een afgeleide klasse maken om de functionaliteit in de basisklasse te gebruiken.
abstracte klasse Vogel
begin
	beschermd
		getal AantalWaarnemingen;
		string Naam;		
	publiek
		constructor Vogel(string Naam)
		begin
			AantalWaarnemingen = 0;
			VogelNaam = Naam;
		eind;
		
		methode WaarGenomen()
		begin
			AantalWaarnemingen = AantalWaarnemingen + 1;
		eind;

		virtuele methode MaakGeluid()
		begin
			// Maak geluid
		eind;
eind;

klasse Meeuw : Vogel
begin
	publiek
		methode Krijs()
		begin
			// Een meeuw die krijst.
		eind;	
		
		methode MaakGeluid()
		begin
			Krijs();
		end;
eind;

// Dit mag
Vogel Jan = nieuw Meeuw("Jan"); 
verwijder Jan;

// DIT MAG NIET!!!
// Want Vogel is een abstracte klasse, er mogen dus
// geen instanties van worden gemaakt.
Vogel Mees = nieuw Vogel("Mees");
verwijder Mees;


Hoe u in een taal een klasse abstract maakt verschilt. In C++ moet u hiervoor één of meerdere puur virtuele methodes maken. Dit zijn virtuele methoden zonder inhoud. Zo zou ons voorbeeld in C++ eruit zien:
#include <string>
using namespace std;

class Vogel
{
protected:
	int AantalWaarnemingen;
	string Naam;
public:
	Vogel(string Naam);
	void WaarGenomen();
	// een puur virtuele methode in C++ herkent u
	// aan = 0 op het eind. Omdat in de klasse
	// Vogel een puur virtuele methode bestaat
	// is Vogel abstract.
	virtual void MaakGeluid() = 0;
};

Vogel::Vogel(string Naam)
{
	AantalWaarnemingen = 0;
	VogelNaam = Naam;
}

void Vogel::WaarGenomen()
{
	AantalWaarnemingen++;
}

void Vogel::MaakGeluid()
{
	// Maak geluid
}

class Meeuw : public Vogel
{
public:
	void Krijs();
	void MaakGeluid();
};

void Meeuw::Krijs()
{
	// Krijs!
}

void Meeuw::MaakGeluid()
{
	Krijs();
}

int main()
{
	Vogel *Jan = new Meeuw("Jan"); 
	delete Jan;

	// DIT MAG NIET!!!
	// Want Vogel is een abstracte klasse, er mogen dus
	// geen instanties van worden gemaakt.
	Vogel *Mees = new Vogel("Mees");
	delete Mees;
}


U hebt nu voldoende kennis om een OOP taal te gaan gebruiken. Hoewel veel talen Object Geörienteerd zijn, zijn er toch verschillen onderling. Zo is het bijvoorbeeld in C++ mogelijk om een klasse van meerdere basisklassen af te leiden. In Java en C# is dit weer niet mogelijk.

Vorige - Volgende