Okay... hier gaan we dan, ik ben meer gewend dit uit te leggen op een bord enzo, met tekeningetjes, dus dit gaat lastig worden... ik ga jullie een aantal dingen vertellen en jullie moeten me maar gewoon geloven dat het waar is. bij vragen zal ik dieper ingaan op begrippen zoals namespace enzo.
"Trust in me... said the devil" [ChOas]
We kunnen het hierna veel ingewikkelder maken, maar eerst een korte uitleg wat OO programeren eigenlijk is.
Wat is een object ? ... nou, kijk om je heen, alles bestaat uit objecten, objecten hebben eigenschappen die verbonden zijn aan een object (e.g. een blikje bier (*grin*, ja ik ben om me heen aan het kijken) kan je weggooien, crushen, leegdrinken. Een tv kan je ook weggooien, maar crushen wordt al wat lastiger, en leegdrinken raad ik echt niet aan. Wat het echter wel allebei zijn is gebruiksvoorwerpen.
Dus als we object georienteerd gaan denken hebben we een classe van 'gebruiksvoorwerpen' waar 'blikjes' en 'tvs' deel van uitmaken. blikjes hebben de eigenschap dat ze leeggedronken kunnen worden, en tvs hebben de eigenschap dat ze aan en uit gezet kunnen worden.
Volgen we het nog ?
Mooi, ga ik ff een biertje halen.
... Zo...
Voor de rest van deze uitleg ga ik gebruikmaken van Randal Schwartz's perlboot (OO programeren voor beginners) het zal geen rechtstreekse vertaling zijn, maar ik ga zijn voorbeelden gebruiken, want het tekent hier zo lastig op een bord
.
Op de boerderij!We gaan een aantal subroutines maken om het geluid van verschillende dieren aan te geven, dat doen we als volgt... eerste gedeelte van de naam is de naam van het dier, dan
:: en dan het woord geluid (waarom we het zo doen kom ik nog op). Al in de war ? ... Misschien maakt dit het duidelijk:
---
#!/usr/bin/perl -w
use strict;
sub Schaap::geluid
{
print "Een schaap maakt dit geluid: Beeeeeeh\n";
};
sub Koe::geluid
{
print "Een koe maakt dit geluid: Boeoeoeoe\n";
};
sub Kip::geluid
{
print "Een kip maakt dit geluid: Tok Tok Tok\n";
};
Schaap::geluid
Koe::geluid
Kip::geluid
---
BRILJANT!!!... ik kan niet anders zeggen!!!... En de output:
---
ChOas-Computer:~/fok choas$
./oo1 Een schaap maakt dit geluid: Beeeeeeh
Een koe maakt dit geluid: Boeoeoeoe
Een kip maakt dit geluid: Tok Tok Tok
ChOas-Computer:~/fok choas$
---
Tot zover niets aan de hand...
Dus laten we wat nieuws proberen...
---
#!/usr/bin/perl -w
use strict;
#no strict 'refs';
sub Schaap::geluid
{
print "Een schaap maakt dit geluid: Beeeeeeh\n";
};
sub Koe::geluid
{
print "Een koe maakt dit geluid: Boeoeoeoe\n";
};
sub Kip::geluid
{
print "Een kip maakt dit geluid: Tok Tok Tok\n";
};
for my $Dier ('Koe','Schaap','Koe','Schaap','Kip')
{
&{$Dier . "::geluid"};
};
---
Wat je moet weten is dit... we hebben het al gehad over de-refereren toch ? ... no, zoals je een scalar mer ${} de-refereert, een array met @{}, en een hash met %{} de-refereer je een subroutine met &{}.
Dus in het loopje wat je ziet zal elke keer een nieuw dier voor $_ worden ingevuld, en de functie die daar bij hoort worden uitgevoerd.
...
NOT! Jullie die deze code hebben geprobeert zullen zien dat Perl zo'n soort klacht geeft wanneer we dit proberen:
Can't use string ("Koe::geluid") as a subroutine ref while "strict refs" in use at ./oo1 line 22.Om dit voorbeeld toch te laten werken voegen spelen we even vals, en voegen we "no strict 'refs'" toe onder 'use strict' ... tis valsspelen, en de mensen die geinteresseerd zijn waarom we dit moeten doen moeten het maar vragen...
Maar.. we zien dat de code werkt.
Latgen we het netter doen... Jullie hebben namelijk net jullie eerste 3 objecten gemaakt...
IS DAT ZO CHOAS ????
Ja klas, dat is zo
Door de dubbele punt in de functienaam geef je eigenlijk aan: object :: eigenschap ...
Dat is cool!.. en het leuke is dat je ook direct van eigenschappen gebruik kan maken zonder dat omslachtige de-refereren (waar use strict zo over ging zeiken)
Een eigenschap van een object gebruiken doen we zo object->eigenschap.
Even laten zien:
---
#!/usr/bin/perl -w
use strict;
sub Schaap::geluid
{
print "Een schaap maakt dit geluid: Beeeeeeh\n";
};
sub Koe::geluid
{
print "Een koe maakt dit geluid: Boeoeoeoe\n";
};
sub Kip::geluid
{
print "Een kip maakt dit geluid: Tok Tok Tok\n";
};
for my $Dier ('Koe','Schaap','Koe','Schaap','Kip')
{
$Dier->geluid;
};---
Output:
---
ChOas-Computer:~/fok choas$
./oo1 Een koe maakt dit geluid: Boeoeoeoe
Een schaap maakt dit geluid: Beeeeeeh
Een koe maakt dit geluid: Boeoeoeoe
Een schaap maakt dit geluid: Beeeeeeh
Een kip maakt dit geluid: Tok Tok Tok
ChOas-Computer:~/fok choas$
---
Nou, dat was het allereerste gedeeltje object georienteerd programeren... deze voorbeelden waren nog totaal nutteloos, maar ik zal later laten zien hoe we door een nieuw object 'Dier' te maken we hier de code kunnen vereenvoudigen, en nog veel meer leuke dingen kunnen doen.
Nu eerst mijn biertje opdrinken, en misschien zo nog een deel