Les(sen) uit deze oefening: Via een loop overlopen we alle diertjes. Dankzij is bevragen we vervolgens ieder dier en enkel die dieren waar we van weten dat ze kunnen praten laten we dan de Zegt methode aanroepen nadat we met as tijdelijk omgezet hebben.
In main
//dieren staan ergens in List<Dier> diertjes//gebruiker gaf bij invoer f in als keuze:if(userinput=="f"){Console.WriteLine("Welk dier?")stringdierkeuze=Console.ReadLine();switch(dierkeuze){case"Slang":foreach(vardierindiertjes){if(dierisSlang){(dierasSlang).Zegt();}}break;case"Varken": //idem met Varken }}
Pro-pro oplossing
Voorgaande resulteert in aardig wat quasi identieke code in de switch. Je kan zelf een generieke methode maken (hebben we niet in leerstof gezien) als volgt (in hoofdprogramma):
(de where is een zogenaamde constraint, uitgelegd hier)
In de switch krijg je dan:
Pokémon vergelijken
In klasse Pokemon:
Een eigen huis
In volgende filmpje leg ik de oplossing stap voor stap uit: video oplossing
De code hieronder is een iets andere oplossing dan in het filmpje. Beide zijn evenwaardig.
Les(sen) uit deze oefening: Properties kunnen vele vormen hebben. In deze oefening spelen we met Prijs getter (set mag niet bestaan, er mag ook geen achterliggende instantievariable prijs zijn!) waarbij we deze soms een hardcoded waarde laten teruggeven (500 bij BadKamer, 400 bij Kamer) en soms een berekening laten doen zoals in Salon.
Wanneer je Prijsoverride krijg je standaard in VS de syntax met pijltjes (=>). Door op het lampje te klikken kan je kiezen om dit om te zetten naar de klassieke vorm zoals in deze oplossing.
public class Huis
{
public List<Kamer> Kamers { get; set; } = new List<Kamer>();
public int BerekenPrijs()
{
int totaal = 0;
foreach (var kamer in Kamers)
{
totaal += kamer.Prijs;
}
return totaal;
}
}
public class Kamer
{
public int Oppervlakte { get; set; }
public string Naam { get; set; }
public virtual int Prijs {get {return 400;}}
}
public class BadKamer : Kamer
{
public override int Prijs {get {return 500;}}
}
public class Salon : Kamer
{
public bool HeeftSchouw { get; set; }
public override int Prijs
{
get
{
if (!HeeftSchouw) return 300;
return 500;
}
}
}
public class Gang : Kamer
{
public override int Prijs
{
get
{
return Oppervlakte * 10;
}
}
}
// Basisklasse Vliegtuig
class Vliegtuig
{
public string ModelNaam { get; set; }
private static Dictionary<string, Vliegtuig> vliegtuigenRegister = new Dictionary<string, Vliegtuig>();
public Vliegtuig(string modelNaam)
{
ModelNaam = modelNaam;
// Registreer het vliegtuig direct bij de aanmaak
vliegtuigenRegister[vliegtuig.ModelNaam] = this;
}
public virtual void Vlieg()
{
Console.WriteLine($"Het vliegtuig {ModelNaam} stijgt op.");
}
// Toont een overzicht van alle geregistreerde vliegtuigen
public static void ToonVliegtuigenRegister()
{
Console.WriteLine("Overzicht van geregistreerde vliegtuigen:");
foreach (var item in vliegtuigenRegister)
{
Console.WriteLine($"Model: {item.Key}, Type: {item.Value.GetType().Name}");
}
}
}
// Subklasse Raket
class Raket : Vliegtuig
{
public Raket(string modelNaam) : base(modelNaam)
{
}
// Uniek vlieg-gedrag voor Raket
public override void Vlieg()
{
Console.WriteLine($"De raket {ModelNaam} schiet de ruimte in!");
}
}
// Subklasse Helikopter
class Helikopter : Vliegtuig
{
public int RotorSnelheid { get; set; }
public Helikopter(string modelNaam, int rotorSnelheid) : base(modelNaam)
{
RotorSnelheid = rotorSnelheid;
}
// Eerst het standaardgedrag uitvoeren, daarna extra bericht over rotor snelheid
public override void Vlieg()
{
base.Vlieg();
Console.WriteLine($"De helikopter {ModelNaam} draait met een rotor snelheid van {RotorSnelheid} RPM.");
}
}
// Hoofdprogramma
class Program
{
static void Main(string[] args)
{
Vliegtuig vliegtuig1 = new Vliegtuig("Boeing 747");
Raket raket1 = new Raket("Saturn V");
Helikopter helikopter1 = new Helikopter("AH-64 Apache", 2500);
Vliegtuig vliegtuig2 = new Vliegtuig("Airbus A320");
Helikopter helikopter2 = new Helikopter("Sikorsky S-76", 1800);
// Toon het volledige register met alle geregistreerde voertuigen
Vliegtuig.ToonVliegtuigenRegister();
// Wacht op een toets voordat het programma afsluit (handig bij console-applicaties)
Console.WriteLine("\nDruk op een toets om af te sluiten...");
Console.ReadKey();
}
}