Het dierenrijk

Maak bovenstaande klassenhierarchie na. Animal is de parentklasse , mammal en reptile zijn childklassen van Animal en zo voort.
Verzin voor iedere klasse een property die de parent klasse niet heeft. (bv Animal heeft “BeweegVoort”, Reptile heeft “AantalSchubben”, etc).
Voorzie in de klasse Animal een virtual methode ToonInfo die alle properties van de klasse op het scherm zet. De overgeërfde klassen overriden deze methode door de extra properties ook te tonen (maar gebruik base.ToonInfo om zeker de parentklasse werking te bewaren).
Maak nu van iedere klasse een object en roep de ToonInfo methode van ieder object aan.
Plaats deze dieren nu in een List<Animal> en kijk wat er gebeurt als je deze met een foreach aanroept om alle ToonInfo-methoden van ieder dier te gebruiken.
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.
Magische dranken (Essential, GPT)
In deze opdracht ontwerp je een systeem waarin dranken niet alleen dorst lessen, maar ook mysterieuze krachten bezitten. Van gewone drankjes tot zeldzame elixers: elke slok telt! 🧪✨

Ontwerp een systeem waarin verschillende dranken een magische kracht”* hebben.
- Maak een basis‑klasse
Drankmet:- Een property voor de naam van de drank.
- Een constructor die de naam instelt.
- Een virtuele methode
BerekenKracht()die een standaard krachtwaarde (50) teruggeeft.
- Maak een sub‑klasse
Elixerdie erft vanDranken een extra propertyIsZeldzaambevat.- Overschrijf de methode
BerekenKracht()zodat eerst de basiskracht (verkregen viabase.BerekenKracht()) wordt berekend en vervolgens een bonus wordt opgeteld: +20 alsIsZeldzaamtrueis, anders +10.
- Overschrijf de methode
Implementeer een hoofdprogramma waarin je meerdere drankobjecten (bijv. een gewoon drankje en een zeldzaam elixer) aanmaakt en hun berekende kracht op de console toont.
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.
Ziekenhuis (Essential)
Deel 1
Maak een basisklasse Patient die een programma kan gebruiken om de doktersrekening te berekenen. Een patiënt heeft:
- een naam
- het aantal uur dat hij in het ziekenhuis heeft gelegen
Een virtual methode BerekenKost zal de totaalkost berekenen en teruggeven. Deze bestaat uit 50euro+ 20euro per uur dat de patiënt in het ziekenhuis lag.
Maak een methode ToonInfo die steeds de naam van de patiënt toont gevolgd door het aantal uur en z’n kosten.
Deel 2
Maak een specialisatieklasse VerzekerdePatient. Deze klasse heeft alles dat een gewone Patient heeft, echter de berekening van de kosten zal steeds gevolgd worden door een 10% reductie.
Toon de werking aan van deze klasse.
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 dierentuin (Essential)
Stagiair Steven werkt voor de dierentuin. Hij moest een klasse Dier schrijven en een klasse Leeuw die ervan erft: een leeuw eet anders en maakt een ander geluid dan een gewoon dier. Een A.I. leverde dit, en Steven plakte het zonder nalezen in zijn project.
De klasse Dier:
internal class Dier
{
private int kiloVoerPerDag;
public string Naam { get; private set; }
public Dier(string naam, int kiloVoer)
{
Naam = naam;
kiloVoerPerDag = kiloVoer;
}
public void Eet()
{
Console.WriteLine($"{Naam} eet {kiloVoerPerDag} kg voer.");
}
public virtual void MaakGeluid()
{
Console.WriteLine($"{Naam} maakt geluid.");
}
}De klasse Leeuw:
internal class Leeuw : Dier
{
public bool IsMannetje { get; private set; }
public Leeuw(string naam, int kiloVlees, bool isMannetje)
{
IsMannetje = isMannetje;
}
public override void Eet()
{
Console.WriteLine($"{Naam} verslindt {kiloVoerPerDag} kg vlees.");
}
public void MaakGeluid()
{
if (IsMannetje)
{
Console.WriteLine($"{Naam} brult: ROAAAR!");
}
else
{
Console.WriteLine($"{Naam} gromt.");
}
}
}En in Main:
Dier kameel = new Dier("Kamiel", 12);
Dier leeuw = new Leeuw("Simba", 7, true);
kameel.Eet();
kameel.MaakGeluid();
leeuw.Eet();
leeuw.MaakGeluid();Deel 1. Zet elke klasse in een eigen bestand en compileer. De compiler meldt één fout en één waarschuwing. Los de fout op. De waarschuwing laat je voorlopig staan.
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. Compileer opnieuw. Nu verschijnen er twee nieuwe fouten. Los ze allebei op, zonder Dier een extra constructor te geven.
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. Het programma compileert nu, met enkel nog de waarschuwing van deel 1. Voer het uit. Welke lijn klopt niet? Zoek de vierde fout. Wat had de waarschuwing je al verteld?
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.
- De compiler meldt niet alle fouten tegelijk. Los de fout op die je ziet, en compileer opnieuw.
virtualenoverridehoren per methode bij elkaar. De A.I. zettevirtualbijMaakGeluidenoverridebijEet, en dus klopte geen van beide.- Een waarschuwing laat je programma starten, maar CS0114 wees hier net naar de enige fout die de compiler niet tegenhield. Zie de waarschuwing over hiding in Een voorbeeld met vliegende objecten.
- Test een override via een variabele van het type van de parent. Via
Leeuwzie je hiding niet. - Zie ook protected keyword en Overloaded constructors en base().
Ballspel met overerving
Deze oefening bouwt verder op het Pong spel uit hoofdstuk 9 van het handboek.
Volgende code toont hoe we een bestaande klasse Ball kunnen overerven om een bestuurbare bal te maken
Basisklasse Ball
We maken een klasse Ball die via Update en Draw zichzelf over het consolescherm beweegt. Enkele opmerkingen:
- We maken sommige variabelen
protectedzodat later de overgeërfde klassen er aan kunnen - Een
staticmethodeCheckHitlaat ons toe te ontdekken of tweeBallobjecten mekaar raken
class Ball
{
public int X { get { return x; } }
public int Y { get { return y; } }
private int x = 0;
private int y = 0;
protected int vx = 0;
protected int vy = 0;
protected char drawChar = 'O';
protected ConsoleColor drawColor = ConsoleColor.Red;
public Ball(int xin, int yin, int vxin, int vyin)
{
x = xin;
y = yin;
vx = vxin;
vy = vyin;
}
public void Update()
{
x += vx;
y += vy;
if (x >= Console.WindowWidth || x < 0)
{
vx *= -1;
x += vx;
}
if (y >= Console.WindowHeight || y < 0)
{
vy *= -1;
y += vy;
}
}
public void Draw()
{
Console.SetCursorPosition(x, y);
Console.ForegroundColor = drawColor;
Console.Write(drawChar);
Console.ResetColor();
}
static public bool CheckHit(Ball ball1, Ball ball2)
{
if (ball1.X == ball2.X && ball1.Y == ball2.Y)
return true;
return false;
}
}Specialisatie klasse PlayerBall
De overgeërfde klasse PlayerBall is een Ball maar zal z’n vx en vy updaten gebaseerd op input via de ChangeVelocity methode:
class PlayerBall : Ball
{
public PlayerBall(int xin, int yin, int vxin, int vyin) : base(xin, yin, vxin, vyin)
{
drawChar = 'X';
drawColor = ConsoleColor.Green;
}
public void ChangeVelocity(ConsoleKeyInfo richting)
{
switch (richting.Key)
{
case ConsoleKey.UpArrow:
vy--;
break;
case ConsoleKey.DownArrow:
vy++;
break;
case ConsoleKey.LeftArrow:
vx--;
break;
case ConsoleKey.RightArrow:
vx++;
break;
default:
break;
}
}
}Eenvoudig spel
We maken nu een rudimentair spel waarin de gebruiker een bal moet proberen te raken.
static void Main(string[] args)
{
Console.CursorVisible = false;
Console.WindowHeight = 20;
Console.WindowWidth = 30;
Ball b1 = new Ball(4, 4, 1, 0);
PlayerBall player = new PlayerBall(10, 10, 0, 0);
while (true)
{
Console.Clear();
//Ball
b1.Update();
b1.Draw();
//SpelerBall
if (Console.KeyAvailable)
{
var key = Console.ReadKey();
player.ChangeVelocity(key);
}
player.Update();
player.Draw();
//Check collisions
if (Ball.CheckHit(b1, player))
{
Console.Clear();
Console.WriteLine("Gewonnen!");
Console.ReadLine();
}
System.Threading.Thread.Sleep(100);
}
}Kan je dit uitbreiden met?
- Ballen met andere eigenschappen
- Meerdere ballen die over het scherm vliegen (benodigdheden: array )
- Meerdere levels
- Score gebaseerd op tijd die gebruiker nodig had om bal te raken (benodigdheden: teller die optelt na iedere
Sleep) - PRO: collision detection tussen de ballen
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.
Drone Delivery System (Final Essentials, GPT)
In deze oefening bouw je de software voor een futuristisch dronetransportbedrijf. Je beheert verschillende types drones die elk hun eigen eigenschappen hebben.
Stap 1: De basis
Maak een klasse Drone met:
- Eigenschap
Model(string) - Eigenschap
Battery(int, start op 100) - Een
virtualmethodeFly():- Vermindert de batterij met 5.
- Schrijft naar de console: “[Model] vliegt rond. Batterij: [Battery]%”
- Als de batterij < 20 is, toont het ook: “Waarschuwing: Low Battery!”
Stap 2: Specialisaties
Maak twee subclasses:
1. DeliveryDrone
- Heeft extra eigenschap
PayloadWeight(int). - Override de
Fly()methode:- Batterij vermindert met 5 + (
PayloadWeight/ 10). - Schrijft naar console: “[Model] levert zwaar pakketje (Zwaarte: [PayloadWeight]). Batterij: [Battery]%”
- Batterij vermindert met 5 + (
2. RacingDrone
- Heeft extra eigenschap
TopSpeed(int). - Override de
Fly()methode:- Batterij vermindert met 10 (want hij vliegt snel).
- Schrijft naar console: “[Model] raced tegen [TopSpeed] km/u. Batterij: [Battery]%”
Stap 3: De Vloot (Polymorfisme)
Maak in je Main programma een List<Drone> aan.
- Voeg enkele gewone Drones, DeliveryDrones (met verschillende gewichten) en RacingDrones toe.
- Schrijf een
while-lus die blijft draaien zolang er nog minstens één drone batterij > 0 heeft. - Roep in de lus voor elke drone de
Fly()methode aan. - Zorg dat drones met een batterij van 0 of minder niet meer vliegen.
- Tip: Je kan dit simuleren met een
System.Threading.Thread.Sleep(500)tussen de loops om het ‘real-time’ te laten lijken.
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.