© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
Polymorfi

Vejledende løsninger
Generel vejledning
Opgaver

 

 

1

I denne opgave skal der laves en række klasser der kan bruges til at beregne portoen for forskellige slags forsendelser med postvæsenet. Klasserne der skal laves kan opstilles i følgende klasse-hierarki.

Figur 1:
Klasse-hierarki for forsendelser
Disse fem klasser skal laves i en package Post.
Klassen Forsendelse har de egenskaber der er fælles for alle slags forsendelser. Alle forsendelser har en vægt der bruges til at beregne portoen. Forsendelse skal erklære en metode porto, der beregner og returnerer portoen for forsendelsen. Forsendelse skal have en set-konstruktor.
Klasserne Forsendelse og Brev skal være abstrakte (bemærk at de netop er skrevet med skrå skrift i klasse-diagrammet).
De tre konkrete subklasser ABrev, BBrev og Pakke implementerer metoden porto, så den beregner og returnerer protoen for forsendelsen. Alle tre konkrete klasser skal have en set-konstruktor. ABrev er et almindeligt brev, BBrev er et økonomibrev og Pakke er en almindelig pakke.
Følgende er en oversigt over taksterne som var i kraft d. 14. nov. 1999 (da denne opgave først blev udarbejdet):
Vægt højest
Porto for almindelig brev
Porto for økonomi brev
20 g.
4,00 kr.
3,75 kr.
50 g.
5,25 kr.
5,00 kr.
100 g.
5,25 kr.
5,00 kr.
250 g.
9,25 kr.
8,75 kr.
500 g.
16,00 kr.
15,00 kr.
1000 g.
20,00 kr.
19,00 kr.
2000 g.
28,00 kr.
27,00 kr.
Man kan ikke sende et brev på mere end 2000 g. Hvis et brev vejer mere end 2000 g. skal metoden porto i ABrev og BBrev returnere -1.
For pakker er taksterne:
Vægt højest
Porto pakke
1 kg.
30,25 kr.
5 kg.
32,25 kr.
10 kg.
41,00 kr.
15 kg.
61,00 kr.
20 kg.
67,00 kr.
Man kan ikke sende en pakke på mere end 20 kg. Hvis en pakke vejer mere end 20 kg. skal metoden porto i Pakke returnere -1.
Hvis man skulle have interesse i det, kan man altid finde de aktuelle takster på www.post.dk.

Implementer samtlige klasser og lave en test-anvendelse.

 

2 [Ikast Handelsskole: Datamatiker - Konstruktions-eksamen, 6. januar 2000: Opgave 7]
Betragt følgende klasse-hierarki:
Figur 2:
Klasse-hierarki for boliger
Vi vil lave objekter, der kan repræsentere lejligheder og villaer. Til det formål vil vi lave to klasser Lejlighed og Villa, men en fælles abstrakt super-klasse Bolig.
Egenskaber:
For alle boliger gælder der, at de har et vist indendørs areal, som kan gøres op i et antal m2. Enhver villa ligger tillige på en grund, som også har et areal.
Man kan købe en villa, idet den har en pris. En lejlighed kan derimod ikke købes, men kun lejes, for et vist månedlig beløb.
En lejlighed vil altid ligge i byen. En villa kan derimod ligge enten i byen eller på landet. Vi vil betegne denne egenskab ved villaer som: At den ligger i by-zone eller ej.
Implementer de tre klasser med de egenskaber, der er beskrevet ovenfor. Lave set- og copy-konstruktorer til samtlige klasser. Lav ligeledes toString-metoder for alle tre klasser, som egner sig til testformål.
 
Placer de tre klasser i en package du kalder Bolig. Beskriv i en kommentar i hver af klasserne hvilken konsekvens det har for placeringen af filen at klassen skal tilhøre klassen Bolig. Hvis du har protected metoder eller data i dine klasser, så beskriv kort i en kommentar, de pågældende steder; hvad det betyder for dem at de optræder i en package.
Vi ønsker at lave en metode årligHusleje, der for alle boliger returnerer den årlige husleje. For lejligheder er dette naturligvis 12 gange den månedlige husleje. For villaer er det mere kompliceret. Vi antager at villaen er købt på kredit, og den årlige "husleje" er derfor et udtryk for hvad det koster at afdrage på lånet. For at holde det simpelt vil vi sige, at den årlige "husleje" for en villa er 10% af dens pris. Hvis villaen ligger på landet, bliver der lagt 20% på huslejen, pga. af værdien af de landlige omgivelser.
Implementer årligHusleje i alle tre klasser. Lav den abstrakt i klassen Bolig.
 
Lav en testanvendelse, der instantierer fem objekter der repræsenterer følgende fem boliger:
En lejlighed på 70 m2 med en månedlig husleje på 3000,- kr.
En villa på 110 m2 der koster 650.000,- kr. Villaen ligger på en grund der er 800 m2 og ligger på landet
En villa på 140 m2 der koster 850.000,- kr. Villaen ligger på en grund der er 400 m2 og ligger i by-zone
En lejlighed magen til den der er nævnt ovenfor
En villa magen til den der er nævnt ovenfor (den som ligger i by-zone).
Testanvendelsen skal udskrive oplysninger om de fem boliger, samt deres årlige husleje.
Lav din testanvendelse så den demonstrerer polymorfien i metoderne: toString og årligHusleje.
 
3 [Ikast Handelsskole: Datamatiker - Konstruktions-reeksamen, 20. januar 2000: Opgave 4]
Betragt følgende klasse-hierarki:
Figur 3:
Klasse-hierarki for biler
Vi vil lave objekter, der kan repræsentere personbiler og lastbiler. Til det formål vil vi lave to klasser PersonBil og LastBil, med en fælles abstrakt super-klasse Bil.

Egenskaber:

For alle biler gælder der, at de har en vægt, der angives i kg. En lastbil har ligeledes en lasteevne der også angives i kg.

I modsætning til en lastbil er det ikke interessant for en personbil hvor meget den kan lastes. Derimod er det personbilens evne til at medtage et vist antal passagerer der interesserer os.

Implementer de tre klasser med de egenskaber, der er beskrevet ovenfor. Lave set- og copy-konstruktorer til samtlige klasser. Lav ligeledes toString-metoder for alle tre klasser, som egner sig til testformål.
Placer de tre klasser i en package du kalder Bil. Beskriv i en kommentar i hver af klasserne hvilken konsekvens det har for placeringen af filen, at klassen skal tilhøre package Bil. Hvis du har protected metoder eller data i dine klasser, så beskriv kort i en kommentar, de pågældende steder; hvad det betyder for dem at de optræder i en package.
Vi har fået den interessante idé at pålægge alle biler en afgift i anledning af år 2000. Vi har gjort det fordi 2000 er et stort og rundt tal (okay - vi har gjort det for pengenes skyld!).
Vi ønsker derfor at lave en metode afgift, der for alle biler returnerer den årlige afgift. For lastbiler består afgiften i 35 øre pr. kg. den selv vejer, plus 20 øre pr. kg den kan lastes med. For personbiler består afgiften i 50 øre pr. kg. den selv vejer, plus 800 kr. pr. passager den kan medtage. afgift skal returnere beløbet i kroner (ikke i ører).
Implementer afgift i alle tre klasser. Lav den abstrakt i klassen Bil.
Lav en testanvendelse, der instantierer fire objekter, som repræsenterer følgende fire biler:

- En lastbil der vejer 2.000 kg. og kan lastes med 400 kg.

- En personbil der vejer 1.100 kg. og kan medtage 5 passagerer.

- En lastbil magen til den der er nævnt ovenfor

- En personbil magen til den der er nævnt ovenfor.

Testanvendelsen skal udskrive oplysninger om de fire biler, samt deres årlige afgift.
Lav din testanvendelse så den demonstrerer polymorfien i metoderne: toString og afgift.
 
4 [Ikast Handelsskole: Datanom - Programkonstruktion I, 7. januar 2000: Opgave 3]
En idrætsforening ønsker at registrere medlemmerne i en database, der skal laves i Java. I forbindelse med dette program skal der laves en række klasser til repræsentation af medlemmerne. Det er disse klasser der skal laves i denne opgave.
Betragt følgende nedarvningshierarki:
Figur 4:
Klasse-hierarki for medlemmer

Klubben opdeler dens medlemmer i to grupper, seniorer og juniorer, efter alder. Når man er fyldt 18 år, er man senior.

Alle medlemmer registreres med navn og alder.

For en junior registreres én forældre, så man ved hvem man i givet fald kan kontakte. Denne forældre registreres på navn og telefonnummer.

4.1 Implementer de tre klasser som de er beskrevet ovenfor. Du skal lave passende set-konstruktorer til alle klasserne.
4.2 Lav de tre klasser så de ligger i en package, der hedder Idraet. Beskriv hvilken konsekvens det får for filernes placering af deres klasser skal tilhøre denne package.
4.3 Lav til testformål en toString-metode i de tre klasser.
Klubben vil gerne bruge programmet til at beregne kontingenter for de enkelte medlemmer. Derfor skal de tre klasser have en metode kontingent, der returnerer det pågældende medlems kontingent.

Juniorer betaler et kontingent på 250,- kr. Hvis en junior er under 15 år betaler han dog kun 150,- kr.

Seniorer betaler et kontingent på 400,- kr. Hvis en senior er fyldt 40 år betaler han dog kun 350,- kr. og er han fyldt 60 år er kontingentet kun 100,- kr.

4.4 Lav metoden kontingent i de tre klasser. Metoden skal være polymorf.
Der ønskes en testanvendelse, der instantierer tre objekter, der repræsenterer følgende tre medlemmer af klubben:

Erling, der er 75 år.

Hans, der er 9 år. Hans far hedder Valdemar og har telefonnummer 97001100

Peter, der er 16 år. Hans mor hedder Vera og har telefonnummer 97224422

Testanvendelsen skal bruge objekterne til at udskrive oplysninger om disse medlemmer og deres kontingent.
4.5 Lav den ovenfor beskrevne testanvendelse.
 
5 [Ikast Handelsskole: Datamatiker - Konstruktions-eksamen, 3. januar 2001: Opgave 5]
Betragt følgende klasse-hierarki:
Figur 5:
Klasse-hierarki for lokaler
Vi vil lave objekter, der kan repræsentere forskellige undervisningslokaler. Til det formål vil vi lave to klasser EDB_Lokale og KlasseLokale, men en fælles abstrakt super-klasse Lokale.

Egenskaber:

For alle lokaler gælder der, at de har et areal, der har betydning for hvor mange studerende, der kan være i lokalet. Et EDB-lokale har en vis kapacitet mht. strøm, som har betydning for hvor mange PC-ere der kan være i lokalet. Vi vil kun betragte strøm som én numerisk størrelse, der er et heltal.

Implementer de tre klasser med de egenskaber, der er beskrevet ovenfor. Lave set- og copy-konstruktorer til samtlige klasser. Lav ligeledes toString-metoder for alle tre klasser, som egner sig til testformål.
 
Placer de tre klasser i en package du kalder Lokaler. Beskriv i en kommentar i hver af klasserne hvilken konsekvens det har for placeringen af filen, at klassen skal tilhøre package Lokaler.
 
Vi ønsker at kunne beregne kapaciteten for ethvert lokale. Vi vil derfor lave en metode kapacitet, der beregner dette. Metoden returnerer hvor mange studerende, der kan undervises i lokalet.
Kapaciteten for et lokale er én studerende pr. 1,5 m2 i et klasselokale, og én studerende pr. 2,5 m2 i et EDB-lokale. Et EDB-lokale har yderligere den begrænsning at hver PC bruger 3 enheder strøm. Der regnes med én PC pr. studerende. Det er derfor muligt at et EDB-lokales kapacitet er mindre end én studerende pr. 2,5 m2, fordi der evt. ikke er strøm nok!
Lad dig ikke distrahere af, at denne måde at beregne kapaciteten på, sikkert ikke er særlig realistisk!
Lad os se et eksempel:

Et EDB-lokale er på 60 m2, og har 70 enheder strøm. Arealet tillader 60/2,5 = 24 studerende i lokalet, men strømmen tillader kun 70/3 = 23 studerende i lokalet. Lokalets kapacitet er derfor 23 studerende.

Implementer metoden kapacitet i alle tre klasser. Lav den abstrakt i klassen Lokale.
 
Lav en testanvendelse, der instantierer fem objekter, som repræsenterer følgende fem lokaler:

Et klasselokale på 40 m2.

Et klasselokale på 30 m2.

Et klasselokale mangen til det på 40 m2.

Et EDB-lokale på 20 m2, med 25 enheder strøm.

Et EDB-lokale på 60 m2, med 70 enheder strøm.

Testanvendelsen skal udskrive oplysninger om de fem lokaler, samt deres kapacitet.
Lav din testanvendelse så den demonstrerer polymorfien i metoderne: toString og kapacitet.
 
6 [Ikast Handelsskole: Datamatiker - Konstruktions-reeksamen, 23. januar 2001: Opgave 4]
Betragt følgende klasse-hierarki:
Figur 6:
Klasse-hierarki for tog
Vi har planer om at overtage togdriften mellem Herning og Silkeborg. Vi ønsker derfor at kunne lave objekter, der kan repræsentere forskellige tog. Til det formål vil vi lave to klasser RegionalTog og LynTog, men en fælles abstrakt super-klasse Tog.

Egenskaber:

For alle tog gælder der, at de har et vist antal sæder, der betegnes som standardpladser. For et regionaltog gælder der, at den kun har standardpladser. Et lyntog har ligeledes standardpladser, men ud over disse har den også sæder der betegnes business-pladser.

Implementer de tre klasser med de egenskaber, der er beskrevet ovenfor. Lav set- og copy-konstruktorer til samtlige klasser. Lav ligeledes toString-metoder for alle tre klasser, som egner sig til testformål.
 
Vi ønsker at kunne beregne, hvor stor en indtægt vi kan opnå på forskellige tog. Vi vil derfor lave en metode billetIndtægt, der beregner dette. Metoden returnerer hvor meget vi maksimalt kan opnå i billet-indtægt.
Prisen for en standard-plads er 20,- kr. og prisen for en business-plads er 50,- kr. Prisen er den samme uanset hvor man skal hen! Lad dig ikke distrahere af at dette er en håbløs urealistisk måde at fastsætte billetpriser på!
Lad os se et eksempel:

Et lyntog med 80 standardpladser og 30 business-pladser kan maksimalt give os en indtægt på: 80·20 + 30·50 = 3.100,- kr.

Implementer metoden billetIndtægt i alle tre klasser. Lav den abstrakt i klassen Tog.
 
Lav en testanvendelse, der instantierer tre objekter, som repræsenterer følgende tre tog:

Et regionaltog med 120 pladser.

Et reginaltog magen til det foregående.

Et lyntog med 80 standardpladser og 30 business-pladser.

Testanvendelsen skal udskrive oplysninger om de tre tog, samt deres maksimalt mulige billet-indtægt.
Lav din testanvendelse så den demonstrerer polymorfien i metoderne: toString og billetIndtægt.