# Oefeningen H13

{% hint style="info" %}
Wil je de leerstof op een andere manier leren gebruiken? Bekijk dan eens [de Corona Files oefeningen](https://apwt.gitbook.io/coronafiles/). Merk op dat de corona files niet zo diepgaand zijn als de andere oefeningen, maar mogelijk wel boeiender. Het is wel zo dat iedere week voort werkt op hetgeen je de missie ervoor hebt gemaakt waardoor je dus finaal een lekker groot project zal hebben.
{% endhint %}

## Het dierenrijk

![Vereenvoudigde voorstelling van (een deel van het) dierenrijk](https://4148059946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MG5D2YWFmrSNveq_UIB%2Fuploads%2Fgit-blob-1f203878d8f894be2731f0295694831e7487bce5%2Fanimals.png?alt=media)

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.

## 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 `Drank` met:
  * 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 `Elixer` die erft van `Drank` en een extra property `IsZeldzaam` bevat.
  * Overschrijf de methode `BerekenKracht()` zodat eerst de basiskracht (verkregen via `base.BerekenKracht()`) wordt berekend en vervolgens een bonus wordt opgeteld: +20 als `IsZeldzaam` `true` is, anders +10.

Implementeer een hoofdprogramma waarin je meerdere drankobjecten (bijv. een gewoon drankje en een zeldzaam elixer) aanmaakt en hun berekende kracht op de console toont.

## 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.

## HiddenBookmark

Voeg een `HiddenBookmark` klasse toe aan je bestaande Bookmark Manager applicatie van vorige hoofdstuk.

De `HiddenBookmark` is een `Bookmark` klasse die de `ToonSite` methode override door VOOR en NA dat de site op het scherm werd getoond er de tekst `**********INCOGNITO MODE************` getoond wordt

Test wat er gebeurt als je al je bookmarks vervangt door `HiddenBookmarks`.

## Ballspel met overerving

## 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 `virtual` methode `Fly()`:
  * 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]%"

**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.
