~~NOTOC~~ {{ :images:banner_transport.jpg |}} ===== Transportmiddel – Beregn prisen for en tur ===== ==== Formål ==== Du skal arbejde med: * Abstrakte klasser og nedarvning * Synlighedsniveauer: ''private'', ''protected'', ''public'' * Konstruktorer og method-override * Test og brug af polymorfi i praksis ==== Scenarie ==== En virksomhed har flere typer transportmidler: **Taxa**, **Lastbil** og **Elbil**. Alle transportmidler har noget til fælles, men prisen for en tur beregnes forskelligt. Du skal modellere dette med en abstrakt //base// klasse og sub-klasser i C#. ---- ==== Opgave ==== - Lav en abstrakt klasse ''Transportmiddel'' med mindst: * Et felt til registreringsnummer (f.eks. "AB12345") * En ''protected'' pris pr. kilometer (f.eks. 10 kr/km) * En offentlig abstrakt metode ''BeregnPris(double kilometer)'' * En offentlig ''ToString()'' metode, der returnerer transportmidlets type og registreringsnummer * Transportmiddel klassen skal have en konstruktor der tager: - et ''string'' registreringsnummer - en ''double'' pris pr. kilometer - Lav følgende 3 underklasser: * ''Taxa'' * ''Lastbil'' * ''Elbil'' - Hver klasse skal override ''BeregnPris'' og bruge en **unik formel** (se nedenstående): * Brug passende synlighedsniveauer: * Felter i baseklassen bør være ''private'' eller ''protected'' * Metoder der skal kunne kaldes udefra skal være ''public'' ++++ Hint | * En abstrakt klasse defineres med keyword: **abstract** * En abstrakt metode har __ingen__ body og __skal__ overrides i subklasser: * %%public abstract double BeregnPris(double kilometer);%% * Brug "**protected**" hvis du vil lade underklasser tilgå feltet direkte, men ikke udefra. * Du kan bruge //this.GetType().Name// i ToString() for at få klassens navn. ++++ ---- ==== Beregningsregler ==== Transportmidlerne beregner prisen forskelligt: === Taxa === * Fast startgebyr på 40 kr. * Derefter: kilometerpris. * %%Pris = 40 + (km * kmPris)%% * Eks: 20 km, kmPris 10 → 40 + 200 = 240 kr === Lastbil === * Kilometerpris + fast broafgift på 150 kr. * %%Pris = (km * kmPris) + 150%% * Eks: 20 km, kmPris 5 → 100 + 150 = 250 kr === Elbil === * 20% rabat på normalprisen. * %%Pris = (km * kmPris) * 0.8%% * Eks: 20 km, kmPris 3 → 60 * 0.8 = 48 kr ---- ==== Test ==== - Lav et array eller en liste med forskellige transportmidler (blandet typer) - Kør en test hvor du beregner prisen for en tur på fx 20 km - Udskriv resultatet med typen, registreringsnummer og beregnet pris ==== Forventet output ==== Det **præcise output** vil afhænge af de værdier du giver objekterne, men noget i stil med: Taxa (AB12345): Pris for 20 km = 240 kr Lastbil (CD67890): Pris for 20 km = 250 kr Elbil (EL00001): Pris for 20 km = 48 kr ++++ Hint | - Du kan teste sådan her: Transportmiddel[] t = { new Taxa("AB12345", 10), new Lastbil("CD67890", 5), new Elbil("EL00001", 3) }; foreach (Transportmiddel tm in t) { Console.WriteLine($"{m}: Pris for 20 km = {m.BeregnPris(20)} kr"); } ++++ ---- ==== Krav ==== * Der **må ikke** kunne laves en instans af klassen Transportmiddel * Du **skal** bruge nedarvning og metode-overriding * Du **skal** bruge synlighedsniveauer bevidst ---- ==== Bonus opgaver (optional) ==== * Lav en metode der returnerer den billigste transportform for en given distance * Tilføj flere typer transportmidler, fx Cykel eller Fly * Lav input fra brugeren (hvor mange km og valg af transporttype) ---- ==== Her finder du hjælp ==== * [[https://learn.microsoft.com/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members|Microsoft: Abstrakte og sealed klasser og members]] * [[https://www.w3schools.com/cs/cs_abstract.php|W3Schools: C# Abstraktion]]