Als we een klasse gaan bouwen, is het belangrijk om het concept achter objecten en klassen nog een keer door te lezen. Dat kan in de cursussen computational thinking en programming principles.
Om een klasse te bouwen, beginnen we met redeneren vanuit het object. Hoe zien de objecten die onze machine gaat produceren eruit? En wat moeten ze kunnen ? In grote lijnen bestaat een object uit 2 grote delen:
- Data : denk hierbij aan een positie, een bepaalde kleur of kenmerk. Elk van de objecten bezit het kenmerk, maar bij elk object is dit individueel anders ingevuld. Denk aan de haarkleur bij mensen bv.
- Functies: dit zijn de dingen die ons object moet kunnen uitvoeren. Misschien moet het zich kunnen verplaatsen, of een bepaalde berekening uitvoeren.
Wanneer we de instellingen op een machine zouden moeten beschrijven, gebruik makend van data en functies, dan zou dit er voor een machine die mensen maakt zo kunnen uitzien:
Data Functies ----- -------- grootte slapen gewicht opstaan haarkleur eten kleur ogen transport nemen/besturen geslacht
Een klasse is een template, waar objecten van kunnen worden afgeleid. We weten nu hoe dit conceptueel in elkaar zit, dus kunnen we concreet gaan kijken hoe we dit op het voorbeeld met de zwarte cirkels kunnen toepassen.
We hebben ons voorbeeld even teruggebracht naar 1 functie, voor het tekenen van 1 cirkel. Dit is louter om de overzichtelijkheid te bewaren. De bedoeling is dat we dit programma herschrijven, zodat deze cirkel helemaal op zichzelf kan bewegen, zonder dat daar steeds nieuwe unieke globale variabelen voor moeten worden gebruikt. We willen naar een algemene klasse die cirkels kan produceren die op verschillende plaatsen en tegen verschillende snelheden bewegen.
int x = 20; int y = 20; int snelheid1 = 1; void setup(){ size(300,300); } void draw(){ background(255); drawBlackCircle(); } void drawBlackCircle(){ fill(0); ellipse(x,y, 50,50); x1 = x1 + snelheid1; }
Belangrijke eerste stap is uit te kijken naar de data en de functies. Wat is de data die onze cirkel nodig heeft om te bestaan ? En wat zijn de functies die moeten worden uitgevoerd ?
Data Functies ----- -------- x coordinaat verplaatsen y coordinaat optioneel: checken of de rand is geraakt breedte optioneel: tekenen hoogte
We willen onze klasse slechts 1 keer aanmaken en ze moet enkel objecten produceren op het moment dat wij dat willen. Dat wil zeggen dat we een klasse niet zullen aanmaken in de setup() of de draw() loop, maar dat een klasse zijn eigen, nieuwe codeblok krijgt, onderaan de code:
void setup(){ //hier wat code } void draw(){ //hier wat code } class MovingCircle{ //hier bouwen we onze klasse op! }
Om onze klasse te bouwen hebben we volgende dingen nodig:
- het woord class gevolgd door de naam van onze klasse. De naam van een klasse laten we altijd met een hoofdletter beginnen, die van een object met een kleine letter
- de data. Dit zijn de variabele kenmerken van onze objecten (denk aan de haarkleur van de mens)
- een constructor. Dit stuk code wordt aangeroepen op het moment dat we een object maken. Dit zijn de startwaarden van het object. Merk op dat de constructor een functie is (zie je aan de ( en ) haken). Deze functie wordt automatisch aangeroepen als je een nieuw object maakt.
- de functies. Dit zijn de zaken die ons object straks moet kunnen doen of uitvoeren
Als we al deze dingen in de code gieten, en we plaatsen het structureel voorbeeld naast het object georiënteerd, zien we dat 90% hetzelfde is gebleven. De structuur is veranderd en alles is ingebed in een groot class codeblok.
Let op: We scheiden heel duidelijk het declareren (aanmaken) en het initiëren (vullen) van de variabelen hierboven. Het belang hiervan wordt straks duidelijk.
Je klasse heeft zijn/haar eigen codeblok. Op dit moment staat dit onderaan je code. Dat is een prima plaats. Je kan in Processing echter ook nieuwe tabbladen aanmaken. De code die je in zo’n tabblad plaatst wordt feitelijk na je hoofdcode geladen (alsof ze achter je draw() loop wordt geplakt).
Oefening
vul de ontbrekende delen van deze code in. Het gaat om een klasse “Human”. Zorg ervoor dat deze een functie “sleep()” krijgt en gebruikt de juiste syntax om een gevoel te krijgen voor het bouwen van klasse:
_______ _______{ color hairColor; float height; __________(){ _________________; _________________; } ____ __________{ _________________ _________________ } }