|
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
|