~~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]]