[G_PRO] Basis Programmeren en OO Programmeren
DigitAP
  • Welkom
  • Inleiding
    • Benodigdheden
    • Afspraken code
    • Afspraken oefeningen
    • Nuttige extras
    • Dankwoord
    • Mee helpen?
  • Semester 1: Programming Principles
    • H1: Werken met Visual Studio
      • Introductie tot C#
      • Visual Studio en .NET Core installeren
      • Een C# project maken in Visual Studio
      • Fouten in je code
      • Je eerste stappen in C#
      • Input/Output: ReadLine/WriteLine
      • Kleuren in Console
      • Oefeningen
    • H2: Variabelen en datatypes
      • De syntaxis van C#
      • Datatypes
      • Variabelen
      • Expressies en operators
      • Oefeningen
    • H3: Strings en hun methoden
      • Strings
      • Strings samenvoegen
      • Omzetten van en naar strings
      • Functionaliteit van strings
      • Oefeningen
    • H4: Beslissingen
      • Beslissingen intro
      • Enkelvoudige booleaanse expressies
      • If, else, else if
      • Samengestelde booleaanse expressies
      • Scope van variabelen
      • Switch
      • Oefeningen
    • H5: Loops
      • Loops intro
      • While en Do While
      • For
      • Debuggen
      • Oefeningen
    • H6: Arrays
      • Array principes
      • Alternatieve syntax
      • Werken met arrays
      • Defaultwaarden
      • List<T>
      • Oefeningen
    • H7: Methoden
      • Methoden intro
      • Parameters
      • Return waarden
      • Geavanceerde methoden
      • Oefeningen
    • Intermezzo: TextCell
    • H8: Numerieke data
      • De Math klasse
      • Random
      • Casting en conversie
      • Oefeningen
    • H9: Meerdimensionaal werken
      • N-dimensionale arrays
      • Geneste iteratie
      • Oefeningen
    • H10: Gevorderde tekstverwerking
      • Voorstelling van tekst
      • Interpolatie met formattering
      • Werken met arrays van strings
      • Input en output van tekstbestanden
      • Oefeningen
    • Afsluiter: TextCell2D
  • Semester 2 : OOP
    • H10: Klassen en objecten
      • OOP Intro
      • Klassen en objecten aanmaken
      • DateTime: leren werken met objecten
      • Enumeraties: nog een eigen datatype
      • Klassen en objecten weergeven deel 1
      • Attributen
      • Methoden
      • Access modifiers
      • Properties
      • Oefeningen
    • H11: Objecten (al dan niet) aanmaken
      • Constructors
      • Spelen met strings
      • Oefeningen
    • H12: Geheugenmanagement bij klassen
      • value en reference met eigen objecten
      • nullable value types
      • NullReference exception
      • Oefeningen
    • H13: Datastructuren
      • Foreach en var
      • List
      • Dictionary
      • Immutable datastructuren
      • Verdere datastructuren
      • Oefeningen
    • H14: Overerving
      • Overerving intro
      • Virtual en override
      • Abstract
      • Constructors bij overerving
      • Oefeningen
    • H15: Geavanceerde overerving
      • protected access modifier
      • Base keyword
      • System.Object
      • Oefeningen
    • H16: Exception handling
      • Werken met exceptions
      • Zelf uitzonderingen maken
      • Wanneer exceptions en handling gebruiken
      • Oefeningen
    • H17: Polymorfisme en interfaces
      • Polymorfisme
      • Polymorfisme in de praktijk
      • Interfaces
      • Losse koppeling
      • Oefeningen
    • H18: Testing
      • Intro Testing
      • Wat is Unit Testing
      • Waarom Unit Testing?
      • Wanneer Unit Testing?
      • Schrijven van een unit test: AAA methode
      • Eerste voorbeeld: Sum
      • Assert
      • Oefening even of oneven getal
      • TestInitialize en DataRows
      • Oefening BMI
      • Exception testing
      • Oefening BMI exception
      • Oefening SchoolAdmin test null-waarden en TestCleanup
      • Oefening SchoolAdmin test equals
      • Oefening SchoolAdmin test cursus zoeken met id
      • Dependencies bij Unit Testing
      • Mocking
      • Oefeningen Mocking
      • Test Driven Development
      • Class Library
      • Oefeningen TDD
    • H19: SOLID
      • Single Responsibility Principle (SRP)
      • Open/Closed Principle (OCP)
      • Liskov Substitution Principle (LSP)
      • Interface Segregation Principle (ISP)
      • Dependency Inversion Principle (DIP)
  • Appendix
    • Visual Studio Tips & Tricks
    • Ea-ict coding guidelines
    • Oefeningen kerkhof
  • Semester 1 appendix
    • Nice to know stuff
      • Out en Ref parameters
      • Jagged arrays
    • All-In-Projecten
      • Overzicht
      • Console Matrix
      • Ascii filmpjes maken met loops
      • Ascii filmpjes maken met methoden
      • Fun with methods: een verhaalgenerator
      • Tekst-gebaseerd Maze game
      • Conway game of life
  • Semester 2 appendix
    • Operator overloading
    • Object Initializer Syntax
    • Compositie en aggregatie
    • Nice to know stuff
      • Klassen herbruiken
      • Expression bodied members
    • All-In-Projecten
      • Overzicht
      • OO Textbased Game
      • War Simulator
      • Map Maker
      • Magic The Gathering API
      • SchoolAdmin
  • Pro (geen leerstof en/of in opbouw)
    • Bitwise operators
    • Generics en collections
      • Generics methoden en types
      • Generic classes en constraints
      • Collections
      • Labo-oefeningen
    • Events
      • Events
      • Chat server
    • Software engineering
      • SOLID
Powered by GitBook
On this page
  • Aparte oefeningen overerving
  • H14-PostOffice
  • H14-Veterinarian
  • H14_1 SchoolAdmin: Persoon
  • H14_2 SchoolAdmin: Student erft over van Persoon
  • H14_3 SchoolAdmin: Personeel erft over van Persoon
  • H14_4 SchoolAdmin: Administratief Personeel
  • H14_5 SchoolAdmin: Lector
  • Klassediagram
Export as PDF
  1. Semester 2 : OOP
  2. H14: Overerving

Oefeningen

Aparte oefeningen overerving

Deze oefeningen maak je allebei in een klasse genaamd Inheritance, met haar eigen ShowSubmenu methode.

H14-PostOffice

Functionele analyse

We werken een systeem uit voor de post, waarin (aangetekende) brieven geregistreerd worden. Dit zal ons toestaan elke brief op te zoeken in het systeem en interessante informatie over de brief op te vragen.

Technische analyse

  • Maak een klasse RegisteredLetter, met een property Distancevan type double, die steeds groter dan 0 moet zijn en de afstand in kilometer uitdrukt die de brief zal moeten afleggen.

  • Voeg een computed property Duration(van type byte) en een property Price(van type double) toe.

    • De reistijd (Duration) is de reisafstand (Distance) gedeeld door 100, afgerond naar boven, uitgedrukt in dagen.

    • De kostprijs (Price) is 15 euro voor brieven die minder dan 100km moeten afleggen. Daarna komt er 10 euro bij per 100km.

  • Voorzie voorlopig geen constructor.

  • Maak een subklasse InternationalRegisteredLetter. Voor deze is de reistijd de reisafstand gedeeld door 50, afgerond naar boven. De kostprijs is 20 euro per 100km; met een minimum van 20 euro. Voorzie voorlopig geen constructor.

  • Maak een subklasse HighPriorityRegisteredLetter. Voor deze is de reistijd de reisafstand gedeeld door 200, afgerond naar boven. De kostprijs is 30 euro per 100km; met een minimum van 30 euro. Voorzie voorlopig geen constructor.

  • Schrijf een methode DemoPostOffice. In deze methode vraag je de gebruiker, tot hij wenst te stoppen, om brieven in te geven voor verzending. Deze worden toegevoegd aan een lijst van brieven. Wanneer hij klaar is met brieven in te geven, toon je per brief alle eigenschappen.

Voorbeeldinteractie

Wil je nog een brief toevoegen? (ja/nee)
> ja
Wat voor brief wil je toevoegen?
1. standaard
2. internationaal
3. hoge prioriteit
4. geen enkele, we zijn klaar met invoeren
> 1
Hoe ver moet deze brief gaan?
> 150
Wat voor brief wil je toevoegen?
1. standaard
2. internationaal
3. hoge prioriteit
4. geen enkele, we zijn klaar met invoeren
> 2
Hoe ver moet deze brief gaan?
> 1000
Wat voor brief wil je toevoegen?
1. standaard
2. internationaal
3. hoge prioriteit
4. geen enkele, we zijn klaar met invoeren
> 3
Hoe ver moet deze brief gaan?
> 800
Wat voor brief wil je toevoegen?
1. standaard
2. internationaal
3. hoge prioriteit
4. geen enkele, we zijn klaar met invoeren
> 4
Brief 1: 150km, reistijd 2 dagen, kostprijs 25 euro
Brief 2: 1000km, reistijd 20 dagen, kostprijs 200 euro
Brief 3: 800km, reistijd 4 dagen, kostprijs 240 euro

H14-Veterinarian

Functionele analyse

Een dierenarts moet zijn "patiënten" opvolgen met een geautomatiseerd systeem. Bepaalde aspecten zijn van toepassing voor alle soorten dieren, maar bepaalde zaken zijn afhankelijk van de diersoort.

Technische analyse

  • Schrijf een abstracte klasse Animal, met een property Name (van type string), Gender(van een enum type, genaamd Genders, met waarden Maleen Female), een abstracte property (van type ImmutableList<string>) Allergies en een abstracte methode ShowChip(van type void)

  • Schrijf concrete subklassen DogenParrot

    • Voor de implementatie van de allergieën van een hond voorzie je eerst een tweede property, IndividualAllergies. Deze mag een gewone List<string> zijn, met default getter en setter. Voor de implementatie van Allergies geef je dan de samenvoeging van de individuele allergieën met "druiven", "noten", "chocolade" en "avocado". Voor ShowChiptoon je de waarde van een property Chip die je op Hond voorziet (met type string).

    • Voor papegaaien geef je een lege lijst van allergieën. Voor de chip toon je het bericht "Papegaaien worden niet gechipt."

Voorbeeldinteractie

Voeg volgende methode DemoVet toe aan je klasse en maak oproepbaar uit het keuzemenu. Test dat alle resultaten kloppen.

public static void DemoVet()
{
   var patients = new List<Animal>();
   var animal1 = new Dog();
   animal1.IndividualAllergies = new List<string> { "vis" };
   animal1.Chip = "ABC123";
   animal1.Gender = Genders.Female;
   animal1.Name = "Misty";
   patients.Add(animal1);
   var animal2 = new Parrot();
   animal2.Gender = Genders.Male;
   animal2.Name = "Coco";
   patients.Add(animal2);
   foreach (var animal in patients)
   {
        Console.WriteLine(animal.Name);
        Console.WriteLine(animal.Gender);
        Console.WriteLine("allergieën:");
        foreach (var allergie in animal.Allergies)
        {
            Console.WriteLine(allergie);
        }
        animal.ShowChip();
   }
}

H14_1 SchoolAdmin: Persoon

Functionele analyse

Om naast studenten ook andere personen, zoals lectoren en administratief personeel te kunnen beheren in SchoolAdmin, maken we enkele nieuwe klassen aan. De eerste klasse die we maken is Person.

Technische analyse

De abstracte klasse Person definieert wat voor alle personen in het systeem hetzelfde is: een id, een naam, een geboortedatum en de leeftijd. Voorzie hiervoor dus private attributen met publieke properties. Voorzie voor de properties Id en BirthDateenkel getters, zodat ze read only zijn. Het Id wordt automatisch ingesteld bij constructie. Hiervoor wordt een teller maxId bijgehouden.

Verder zegt deze klasse ook dat elke klasse die er van erft, ten minste de methoden GenerateNameCard en DetermineWorkload moet bevatten. Hoe dat naamkaartje er moet uitzien, legt Person niet vast.

Elke nieuwe persoon die gemaakt wordt, wordt bewaard in een lijst met alle personen. Deze lijst mag door andere klassen niet gewijzigd worden: het beheer van de lijst ligt bij Person. Deze lijst kan wel opgevraagd worden via een statische property AllPersonsdie een immutable list produceert.

Klassediagram

H14_2 SchoolAdmin: Student erft over van Persoon

Functionele analyse

Een student is een soort Persoon.

Technische analyse

De klasse Student wordt een kind van Person. Zorg er dus voor dat deze klasse de verplichte zaken uit Person implementeert, maar dat duplicate functionaliteit (bv. StudentNumber, Name, BirthDate, Age, StudentCounter) vanaf nu aan Person worden overgelaten: haal deze dus weg uit Student. Let op de kleine wijzigingen van type!

Voeg op Student ook een attribuut StudentFile toe. Dit dossier is een collectie waarin opmerkingen genoteerd kunnen worden. De opmerkingen worden geïndexeerd met de datum en het tijdstip waarop ze worden ingegeven. Zorg er voor dat dit dossier niet aangepast kan worden buiten de Student klasse door de getter een immutable dictionary te laten teruggeven.

Klassediagram

Test nu de eerdere methodes DemoStudentsen ReadTextFormatStudent opnieuw uit. Alles zou nog moeten werken.

H14_3 SchoolAdmin: Personeel erft over van Persoon

Functionele analyse

Ook een personeelslid is een soort persoon.

Technische analyse

Employee is een abstracte klasse die erft van Person. In deze klasse wordt een (immutable) lijst bijgehouden van alle personeelsleden die worden aangemaakt. Ze voorziet ook een anciënniteitsteller (Seniority): hierin wordt bijgehouden hoeveel jaar het personeelslid al in dienst is. De anciënniteit kan nooit hoger gaan dan 50. Hogere waarden worden verlaagd tot 50.

De klasse eist van al haar kindklassen dat zij een methode CalculateSalarybevatten. Hoe het salaris berekend moet worden, wordt overgelaten aan de kindklassen.

De klasse Employee voorziet ook een lijst van taken (Tasks) die het personeelslid moet uitvoeren. De taken worden opgeslagen als een naam van een taak, met daarbij het aantal uur per week dat het personeelslid aan die taak zal werken. Deze taken kunnen bij constructie worden meegegeven, maar het oorspronkelijke dictionary mag de taken niet meer kunnen aanpassen. Je moet dus de keys en values kopiëren naar het nieuwe dictionary.

klassediagram

H14_4 SchoolAdmin: Administratief Personeel

Functionele analyse

Administratief personeel is een soort personeel.

Technische analyse

Deze klasse, AdministrativePersonnel is een kind van Employeeen moet daarom aan alle voorwaarden van Employeeén Person voldoen: er zullen dus enkele methoden verplicht moeten worden geïmplementeerd in deze klasse. Er wordt ook een (immutable) lijst bijgehouden van alle administratieve personeelsleden die worden aangemaakt.

Het salaris van een administratief personeelslid wordt als volgt berekend: per 3 jaar, krijgt het personeelslid 75 euro extra bovenop een basisloon van 2000 euro. Dit basisloon wordt vervolgens verrekend met de tewerkstellingsbreuk. De tewerkstellingsbreuk is de werkbelasting van het personeelslid gedeeld door 40 uur (voltijdse tewerkstelling).

Bijvoorbeeld: Ahmed is 4 jaar in dienst. Hij krijgt dus 2000 EUR basisloon, plus 1 keer 75 EUR anciënniteitstoeslag. Hij werkt echter 30 uur per week in plaats van 40, dus krijgt hij 1556,25 EUR. Cijfers na de komma vallen weg omwille van het datatype.

De werkbelasting van een administratief personeelslid wordt bepaald aan de hand van de taken in zijn of haar takenlijst. De duur van alle taken wordt hiertoe opgeteld.

Het naamkaartje van een administratief personeelslid bevat de naam van het personeelslid, met daarachter de vermelding (ADMINISTRATIE). Bv.

Ahmed Azzaoui (ADMINISTRATIE)

Schrijf nu in Program.cs een methode DemoAdministrativePersonnel. Maak hierin een variabele ahmed die behoort tot het administratief personeel. Zijn taken bestaan uit 10u roostering, 10u correspondentie en 10u animatie. Hij is geboren 4 februari 1988.

Doorloop vervolgens met een foreach de lijst met alle administratief personeel en toon alle naamkaartjes. Toon dan ook het salaris en de werkbelasting van Ahmed.

klassediagram

Voorbeeldinteractie

H14_5 SchoolAdmin: Lector

Functionele analyse

Een lector maakt ook deel uit van het personeel.

Technische analyse

De klasse Lecturer is een kind van Employeeen moet daarom aan alle voorwaarden van Employeeén Person voldoen: er zullen dus enkele methoden verplicht moeten worden geïmplementeerd in deze klasse. Er wordt ook een lijst bijgehouden van alle lectoren die worden aangemaakt.

Een Lecturer object bevat dan weer een opsomming van alle Courses die deze lector geeft, met voor elke cursus de werkbelasting van deze cursus voor de lector.

Het salaris van een lector wordt als volgt berekend: per 4 jaar, krijgt het personeelslid 120 euro extra bovenop een basisloon van 2200 euro. Dit basisloon wordt vervolgens verrekend met de tewerkstellingsbreuk. De tewerkstellingsbreuk is de werkbelasting van het personeelslid gedeeld door 40 uur (voltijdse tewerkstelling).

Bijvoorbeeld: Anna is 9 jaar in dienst. Ze krijgt dus 2200 EUR basisloon, plus 2 keer 120 EUR anciënniteitstoeslag. Ze werkt 10 uur per week in plaats van 40, dus krijgt ze 610,00 EUR.

De werkbelasting van een lector wordt bepaald aan de hand van de cursussen die hij of zij geeft. De werkbelasting van elke cursus in de collectie wordt hiertoe opgeteld.

Het naamkaartje van een lector bevat de naam van de lector, met op een nieuwe lijn Lector voor: . Vervolgens worden de titels van alle cursussen die deze lector geeft op telkens een nieuwe lijn toegevoegd. Bv.

Anna Bolzano
Lector voor:
Economie
Statistiek
Analystische Meetkunde

Schrijf nu in Program.cs een methode DemoLecturers. Maak hierin een variabele anna met de gegevens van bovenstaande persoon. Maak hierin ook variabelen voor de drie cursussen in het voorbeeld boven. Anna heeft 3u economie, 3u statistiek en 4u analytische meetkunde. Ze is geboren 12 juni 1975.

Doorloop vervolgens met een foreach de lijst met alle lectoren en toon zo alle naamkaartjes van de lectoren. Toon dan ook het salaris en de werkbelasting van Anna.

klassediagram

Voorbeeldinteractie

Klassediagram

Hieronder zie je al de klassediagrammen tot nu in SchoolAdmin:

PreviousConstructors bij overervingNextH15: Geavanceerde overerving

Last updated 1 year ago