Meetlat constructor (Essential)
Doel: Pas de bestaande Meetlat klasse uit het vorige hoofdstuk aan om met een constructor te werken.
Stappenplan:
- Verwijder de write-only property
BeginLengte. - Voeg toe een private instantievariabele:
private double lengteInMeter;. - Maak een Constructor die één parameter aanvaardt (type
double) en wijs deze waarde toe aanlengteInMeter. - Pas de werking van de overige properties aan zodat ze nu deze nieuwe variabele gebruiken in plaats van de property.
Voorbeeldgebruik:
// Oude manier (werkt NIET meer na aanpassing):
// Meetlat m = new Meetlat();
// m.BeginLengte = 5;
// Nieuwe manier:
Meetlat m = new Meetlat(5);
Console.WriteLine(m.LengteInCm);Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Persoonsregistratie (Essential) (GPT)
Deze oefening werd gemaakt (en aangepast nadien) met behulp van volgende GPT en heeft daarom de tag (GPT) achter de titel staan.
Doel: Gebruik constructors en object initializers om personen aan te maken.
Specificaties:
- Klassenaam:
Persoon - Properties (Auto):
Voornaam(string)Achternaam(string)Geboortejaar(int)Email(string)
- Constructor:
- Parameters:
voornaam,achternaam. - Validatie:
- Indien
voornaamgelijk is aanachternaam-> Werp eenArgumentExceptionop met de boodschap “Voornaam en achternaam mogen niet hetzelfde zijn”.
- Indien
- Parameters:
- Methode:
ToonInformatie()(void): Toont de tekst:"{Voornaam} {Achternaam} geboren in {Geboortejaar} heeft emailadres: {Email}".
Opdracht in Main:
- Maak een
Persoonobject aan met de constructor. - Gebruik Object Initializer Syntax om ook meteen
GeboortejaarenEmailin te stellen.- Voorbeeld:
new Persoon("Jan", "Janssens") { Geboortejaar = 1990, ... }
- Voorbeeld:
- Roep
ToonInformatie()aan. - Schrijf code die test of je applicatie niet krasht als je een foutieve naam ingeeft (gebruik
try-catch).
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Stevens constructors (Essential)
Stagiair Steven moest vier kleine klassen afwerken, telkens met een constructor erbij. Hij liet een A.I. het werk doen en leverde alles in zonder één keer op “Start” te klikken.
Lees elk stuk eerst zonder Visual Studio en antwoord op papier: compileert het? Zo nee, waar zit de fout en waarom? Zo ja, wat toont het programma? Typ de code pas daarna over en kijk of je gelijk had.
Deel 1. Een rugzak die weet hoeveel liter erin kan:
internal class Rugzak
{
private double inhoudInLiter;
public void Rugzak(double inhoud)
{
inhoudInLiter = inhoud;
}
public double InhoudInLiter
{
get { return inhoudInLiter; }
}
}In Main:
Rugzak schoolRugzak = new Rugzak(25);
Console.WriteLine($"Deze rugzak kan {schoolRugzak.InhoudInLiter} liter aan.");Compileert dit? Zo niet, wat moet er anders?
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Deel 2. Een boek met een titel. Steven had zijn Main al geschreven voor de A.I. de constructor toevoegde:
internal class Boek
{
public Boek(string titelIn)
{
Titel = titelIn;
}
public string Titel { get; private set; }
public int AantalPaginas { get; set; }
}In Main:
Boek roman = new Boek("De Avonden");
roman.AantalPaginas = 316;
Boek notitieboek = new Boek();
notitieboek.AantalPaginas = 80;
Console.WriteLine($"{roman.Titel} telt {roman.AantalPaginas} pagina's.");
Console.WriteLine($"{notitieboek.Titel} telt {notitieboek.AantalPaginas} pagina's.");Compileert dit? Zo niet, los het op twee manieren op: één keer door enkel Main aan te passen, en één keer door enkel de klasse aan te passen.
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Deel 3. Een pizzeria wil weten hoeveel bestellingen er vandaag al waren, en per tafel hoeveel pizza’s die bestelde:
internal class Bestelling
{
private static int aantalBestellingen = 0;
private int aantalPizzas;
public Bestelling(int aantalPizzasIn)
{
aantalPizzas = aantalPizzasIn;
aantalBestellingen++;
}
public static void ToonOverzicht()
{
Console.WriteLine($"Vandaag al {aantalBestellingen} bestellingen.");
Console.WriteLine($"Deze bestelling telt {aantalPizzas} pizza's.");
}
}In Main:
Bestelling tafel1 = new Bestelling(3);
Bestelling tafel2 = new Bestelling(2);
Bestelling.ToonOverzicht();Compileert dit? Zo niet, welke regel is het probleem? Pas de klasse en Main aan zodat het programma eerst het aantal bestellingen toont en daarna het aantal pizza’s van elke tafel.
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Deel 4. Een spaarpot:
internal class Spaarpot
{
private double bedrag;
public Spaarpot(double bedrag)
{
bedrag = bedrag;
}
public double Bedrag
{
get { return bedrag; }
}
public void StopErIn(double extra)
{
bedrag = bedrag + extra;
}
}In Main:
Spaarpot pot = new Spaarpot(20);
pot.StopErIn(5);
Console.WriteLine($"In de spaarpot zit {pot.Bedrag} euro.");Steven verwacht In de spaarpot zit 25 euro. Compileert dit? Wat toont het programma echt, en waarom?
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
- Een constructor heeft geen returntype. Met
voidervoor is het een gewone methode. Zie Default constructors. - Schrijf je zelf een constructor, dan is de gratis default constructor weg. Heb je hem nodig, schrijf hem er dan bij en hergebruik de andere constructor met
this(...). Zie Overloaded constructors en Constructors hergebruiken met this(). - Een static methode heeft geen object en kan dus geen instantievariabelen lezen. Zie Static tegenover non-static.
- Deel 4 compileert, met één waarschuwing. Lees in de Error List ook de waarschuwingen, niet enkel de fouten.
Digitale kluis (Essential)

Basiskluis
Specificaties:
- Klassenaam:
DigitaleKluis - Instantievariabelen:
private int code(de echte code).private int aantalPogingen(standaard 0).
- Properties:
CanShowCode(bool): Mag de code getoond worden?Code(int): Full property met private set.- Get logica:
- Als
CanShowCode == true: Geef de echtecodeterug. - Als
CanShowCode == false: Geef altijd-666terug.
- Als
- Get logica:
CodeLevel(int) - ReadOnly:- Formule:
code / 1000(gehele deling).
- Formule:
Constructors:
- Constructor die één
intaanvaardt en deze instelt als decode.
Methode TryCode(int ingevoerdeCode): Deze methode controleert de code en geeft true (juist) of false (fout) terug. De methode print ook feedback naar de console.
Beslissingstabel voor TryCode:
| Situatie | Conditie | Actie (Console Output) | Return Waarde |
|---|---|---|---|
| Valsspeler | ingevoerdeCode == -666 |
“CHEATER” | false |
| Reeds Geblokkeerd | aantalPogingen >= 10 |
“Je hebt je 10 pogingen opgebruikt.” | false |
| Juiste Code | ingevoerdeCode == code |
“Geldige code. Aantal pogingen = {aantalPogingen}” | true |
| Foute Code | ingevoerdeCode != code |
“Geen geldige code.” (Verhoog aantalPogingen met +1) |
false |
Kluizen kraken (Static Methode)
Voeg een statische methode toe om een kluis te kraken via brute-force.
Specificaties:
- Locatie: In de klasse
DigitaleKluis. - Signatuur:
static void BruteForce(DigitaleKluis kluis) - Werking:
- Start een lus die 10 keer herhaalt.
- Kies telkens een willekeurig getal.
- Probeer dit getal op de meegegeven
kluisviakluis.TryCode(getal). - Als
TryCodetrueteruggeeft: Stop en toon “Gekraakt!”.
Test dit in je Main door een kluis aan te maken en DigitaleKluis.BruteForce(mijnKluis) aan te roepen.
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Pokémon deel 2 (Essential)
Constructors
Pas je Pokemon klasse aan zodat deze op 3 manieren aangemaakt kan worden. Dit betekent dat je 2 constructors moet toevoegen (de default constructor bestaat al, tenzij je die overschreven hebt).
De 3 manieren:
- Default Constructor:
- Gebruik:
new Pokemon() - Actie: Stel alle 6 base-stats standaard in op 10.
- Gebruik:
- Overloaded Constructor:
- Gebruik:
new Pokemon(hp, att, def, spAtt, spDef, speed) - Actie: Stel de 6 base-stats in met de meegegeven waarden.
- Gebruik:
- Object Initializer:
- Gebruik:
new Pokemon() { Naam = "Pikachu", Nummer = 25 } - Actie: Hiervoor hoef je niets speciaals te doen, dit werkt automatisch als je een parameterloze constructor hebt en de
setvan de properties van buitenaf bereikbaar is.
- Gebruik:
Zet de setters van je Base Stat properties op private. Dan kan enkel de klasse zelf ze nog aanpassen, bijvoorbeeld in de constructor. Van buitenaf kan niemand ze nog wijzigen, ook niet via object initializer syntax: die werkt enkel met properties waarvan de set van buitenaf bereikbaar is. De base-stats geef je dus mee via de constructor, en met een initializer stel je enkel nog zaken als Naam en Nummer in.
Static methoden en properties
Breid de klasse Pokemon uit met functionaliteit om statistieken over alle Pokémon bij te houden.
Static Properties (Private Set):
TellerLevel: Hoe vaak isVerhoogLevelin totaal aangeroepen?TellerBattles: Hoeveel battles zijn er geweest?TellerGelijkspel: Hoe vaak was het gelijkspel?TellerGeneraties: Hoe vaak isGeneratorPokemonaangeroepen?NoLevelingAllowed(bool, public set): Indientrue, mag niemand nog levelen.
Static Methoden:
- Verplaats
GeneratorPokemonenBattlevanProgram.csnaar de klassePokemon. Pas ze aan zodat ze de tellers hierboven verhogen. static void Info(): Print de waarden van alle tellers naar de console.
Aanpassing VerhoogLevel:
- Controleer eerst
NoLevelingAllowed.- Indien
true: Werp exception “Leveling not allowed”. - Indien
false: Verhoog level en verhoogTellerLevel.
- Indien
Student Kevin Van Rooy maakte volgende applicatie waarbij bovenstaande opgave als initiële inspiratie diende:

Natures (PRO)
Pokémon hebben een “Nature” (aard) die hun stats beïnvloedt (+10% op één stat, -10% op een andere).
Specificaties:
- Enum: Definieer
Nature(zie tabel). - Property: Voeg een property
Naturetoe aan je Pokémon klasse. - Constructor: Zorg dat elke nieuwe Pokémon een willekeurige Nature krijgt in de constructor.
Implementatie van de Bonus: Pas de berekening van je Full Stats aan. Gebruik een helper-methode om je code netjes te houden.
Tip: Maak een helper methode: private double BerekenNatureModifier(StatType stat)
- Geeft
1.10terug als de nature deze stat verhoogt. - Geeft
0.90terug als de nature deze stat verlaagt. - Geeft
1.0terug in alle andere gevallen.
Vermenigvuldig je Full Stat berekening met dit getal (en cast terug naar int).
| Nature | Verhoogt met 10% | Verlaagt met 10% |
|---|---|---|
| Adamant | Attack | Sp. Atk |
| Bashful | Sp. Atk | Sp. Atk |
| Bold | Defense | Attack |
| Brave | Attack | Speed |
| Calm | Sp. Def | Attack |
| Careful | Sp. Def | Sp. Atk |
| Docile | Defense | Defense |
| Gentle | Sp. Def | Defense |
| Hardy | Attack | Attack |
| Hasty | Speed | Defense |
| Impish | Defense | Sp. Atk |
| Jolly | Speed | Sp. Atk |
| Lax | Defense | Sp. Def |
| Lonely | Attack | Defense |
| Mild | Sp. Atk | Defense |
| Modest | Sp. Atk | Attack |
| Naive | Speed | Sp. Def |
| Naughty | Attack | Sp. Def |
| Quiet | Sp. Atk | Speed |
| Quirky | Sp. Def | Sp. Def |
| Rash | Sp. Atk | Sp. Def |
| Relaxed | Defense | Speed |
| Sassy | Sp. Def | Speed |
| Serious | Speed | Speed |
| Timid | Speed | Attack |
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Sport simulator
Gebruik je Sportspeler (of Voetballer) klasse van de “Sports” oefening die je in hofdstuk 9, week 3, maakte. Voeg de volgende statische methoden toe aan Program.cs.
1. SimuleerSpeler
- Signatuur:
static void SimuleerSpeler(Sportspeler speler) - Werking:
- Roep in een loop 3 keer de acties van de speler aan (bv.
SchietOpDoelenMaakOvertreding).
- Roep in een loop 3 keer de acties van de speler aan (bv.
2. SimuleerWedstrijd
- Signatuur:
static void SimuleerWedstrijd(Sportspeler speler1, Sportspeler speler2) - Werking:
- Bepaal willekeurig wie wint (50/50 kans).
- Toon: “Speler X wint.”
- Roep een actie aan van de winnaar.
3. BesteSpeler
- Signatuur:
static Sportspeler BesteSpeler(Sportspeler speler1, Sportspeler speler2) - Werking:
- Kies willekeurig een winnaar.
- Retourneer het winnende object.
Test: Maak in je Main twee spelers aan en test deze 3 methoden.
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Project: GreenRide (Final Essentials)
Scenario: Proficiat! Je bent zonet aangesteld als CTO (Chief Technical Officer) van GreenRide, de nieuwste hipste start-up van ’t Stad. De missie? De wereld veroveren met elektrische deelsteps.
De investeerders zijn enthousiast, maar er is één probleem: er is nog geen software. Aan jou om de Core-Backend te schrijven die alle steps beheert, de winst berekent, en ervoor zorgt dat gebruikers niet kunnen wegrijden met een lege batterij.
Als CTO beslis je om slim gebruik te maken van static variabelen voor zaken die voor alle steps gelden (zoals de prijs), en instance variabelen voor unieke data (zoals de locatie en batterij van één specifieke step).
Specificaties:
1. De DeelStep Klasse
- Statische Data (The Company Level):
PrijsPerMinuut(double): De huidige ritprijs als property. Standaard0.25euro. (Dit kan veranderen tijdens spitsuren!).TotaalWinst(double): De heilige graal. Houdt bij hoeveel euro alle steps samen al hebben opgebracht sinds de start van de server. Ook een static property.AantalInGebruik(int): Een live teller van hoeveel steps er op dit eigenste moment rondrijden. Wederom een static property (alle drie transformeren, en hebben dus geen set).volgNummerGenerator(private static int): Een interne teller om elke step een uniek ID te geven (start bij 1).
- Instance Data (The Step Level):
ID(int): Het unieke nummer van de step. (Read-only voor de buitenwereld).BatterijNiveau(int): Hoeveel energie heeft deze step nog? (0-100).IsBezig(bool): Is deze step momenteel verhuurd?
- Constructors:
DeelStep(): De “Fabrieksinstelling”.- Zet
BatterijNiveauop 100. - Ken een nieuw uniek
IDtoe via de statische generator (en verhoog die generator daarna).
- Zet
DeelStep(int batterij): Voor steps die uit onderhoud komen.- Zet
BatterijNiveauop de meegegeven waarde. - Ken ook hier een uniek
IDtoe.
- Zet
- Methoden:
StartRit()(void):- Validatie: Een step kan enkel vertrekken als:
- De batterij > 10% is.
- Hij niet al in gebruik is (
IsBezigis false).
- Actie: Zet
IsBezigop true, en verhoog de statischeAantalInGebruik. - Output: Toon “Step [ID] vertrekt met [X]% batterij.” of een foutmelding indien niet mogelijk.
- Validatie: Een step kan enkel vertrekken als:
EindigRit(int aantalMinuten)(void):- Validatie: Kan enkel als de step effectief weg was.
- Actie:
- Zet
IsBezigop false. - Verlaag
AantalInGebruik. - Bereken de kost:
aantalMinuten * PrijsPerMinuut. - Voeg dit bedrag toe aan de statische
TotaalWinst. - Verminder de batterij: Simuleer dat 1 minuut rijden = 1% batterijverlies. (Zorg dat batterij niet onder 0 zakt).
- Zet
- Output: Toon een bonnetje: “Step [ID] terug. Ritprijs: €[Bedrag]. Resterende batterij: [X]%”.
2. Het Dashboard (Main Programma)
Schrijf een simulatie in je Program.cs om aan de investeerders te tonen:
- De Vloot: Maak 3 steps aan (waarvan eentje met een platte batterij via de 2e constructor).
- De Ochtendspits:
- Laat step 1 en 2 vertrekken.
- Probeer step 3 te laten vertrekken (zou moeten falen wegens batterij).
- Toon hoeveel steps er nu in gebruik zijn (via de static property).
- Prijsstijging:
- Het begint te regenen en de vraag stijgt. De directie beslist:
DeelStep.PrijsPerMinuut = 0.50;.
- Het begint te regenen en de vraag stijgt. De directie beslist:
- De Aankomst:
- Laat step 1 stoppen na 20 minuten.
- Laat step 2 stoppen na 10 minuten.
- De Balans:
- Toon de
TotaalWinstvan het bedrijf. - Toon de batterijstatus van step 1 (is die verminderd?).
- Toon de
Extra (Pro): Voeg een statische methode GeefGratisStroom() toe aan de klasse, die alle steps (die niet bezig zijn) terug oplaadt naar 100%. (Hiervoor zal je wel een lijst van alle aangemaakte objecten moeten bijhouden in de klasse zelf… uitdagend!).
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.