Grundlæggende Programmering IT-C, Forår 2001 Løbeseddel 8
Grundlæggende Programmering IT-C, Forår 2001 Løbeseddel 8
Grundlæggende Programmering IT-C, Forår 2001 Løbeseddel 8
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Forelæsninger i uge 12: 19/3 – 23/3<br />
<strong>Løbeseddel</strong> 8<br />
<strong>2001</strong>-03-14<br />
Til forelæsningerne gennemgås klassehierarkier: superklasse og subklasse, nedarvning (‘inheritance’), overskrivning<br />
(‘overriding’), overlæsning (‘overloading’) og polymorfi (‘polymorphism’). Dette er en meget væsentlig del af objektorienteret<br />
programmering. Nedarvning understøtter modellering af specialtilfælde (en bil er en bestemt slags køretøj),<br />
og fremmer genbrug af programdele og metoder.<br />
Endvidere gennemgås abstrakte klasser og klassegrænseflader (‘interfaces’). En abstrakt klasse kan definere felter<br />
og metoder men kan ikke instantieres (dvs. bruges som skabelon til at danne objekter), men den vil typisk have<br />
subklasser som kan. En klassegrænseflade (‘interface’) kan betragtes som en ultra-abstrakt klasse: den kan kun erklære<br />
konstante felter (final) og abstrakte metoder.<br />
Læsestoffet i denne uge er Lewis og Loftus, 2. udgave: kapitel 7 samt afsnit 5.3, 5.4.<br />
Øvelser i uge 13: 26/3 – 30/3<br />
Ved øvelserne skal I løse nogle af opgaverne nedenfor. Løsninger til opgaverne Java61, Java62 og Java64 skal afleveres<br />
i din instruktors dueslag onsdag 28/3 i receptionen på <strong>IT</strong>-højskolen.<br />
Opgave Java61 — flere beholdere<br />
Denne opgave handler om klassehierarkiet af beholdere fra forelæsning 8. Klasserne er defineret i Vessel9.java.<br />
Definér en ny klasse Cube der repræsenterer en terningformet beholder, lige stor på alle leder. Den kan gøres til en<br />
subklasse af Tank (løsning A, der kan laves meget elegant) eller en direkte subklasse af Vessel (løsning B):<br />
Klassehierarki - løsning A<br />
Vessel<br />
Barrel Tank<br />
Cube<br />
Klassehierarki - løsning B<br />
Barrel<br />
Vessel<br />
Tank Cube<br />
Forsyn alle beholderklasser med en metode boolean empty() der afgør om beholderen er tom. Vink: Overvej<br />
hvor højt i hierarkiet metoden empty kan defineres; kan den erklæres (ikke-abstrakt) i klassen Vessel?<br />
Lav en metode static boolean empty(Vessel[] vs) der tager en tabel af beholdere som argument og<br />
afgør om samtlige beholdere i tabellen vs er tomme.<br />
Lav et eksempel (i en main-metode) der bruger de nye metoder.<br />
Du kan f.eks. lave følgende klasse som tester dine beholderklasser:<br />
public class Java61 {<br />
static boolean empty(Vessel[] vs) {<br />
// Skriv din kode for empty her.<br />
}<br />
}<br />
public static void main(String[] args) {<br />
Vessel v1 = new Tank(15, 9, 12);<br />
Vessel v2 = new Cube(15);<br />
Vessel v3 = new Barrel(2.5, 8);<br />
Vessel[] vs = {v1,v2,v3};<br />
System.out.println("Alle tre beholdere er tomme (true): " + empty(vs));<br />
v2.fill(20000);<br />
System.out.println("Indhold af v2 = " + v2.contents);<br />
System.out.println("Alle tre beholdere er tomme (false): " + empty(vs));<br />
}<br />
1
der giver følgende uddata:<br />
Alle tre beholdere er tomme (true): true<br />
Indhold af v2 = 3375.0<br />
Alle tre beholdere er tomme (false): false<br />
Opgave Java62 — personer på <strong>IT</strong>-C<br />
Definer et klassehierarki til at repræsentere personer på <strong>IT</strong>-C:<br />
Studerende<br />
<strong>IT</strong>CPerson<br />
Ansat<br />
VIP TAP<br />
Stiplede kasser repræsenterer abstrake<br />
klasser.<br />
Start med den abstrakte klasse <strong>IT</strong>CPerson der skal indeholde felter for navn og adresse. Klassen skal også forsynes<br />
med en konstruktor samt en toString metode der laver en tegnstreng sammensat af personoplysningerne. Vi lader<br />
klassen være abstrakt selvom at alle metoderne er implementeret.<br />
Underklassen Studerende er konkret og tilføjer et studienummer til de oplysninger der gemmes om personen.<br />
Overskriv metoden toString fra <strong>IT</strong>CPerson således at studienumeret kommer med (brug super.toString()<br />
for at få fat i toString metoden fra <strong>IT</strong>CPerson). Lav også en passende konstruktor der initialiserer feltet studienummer<br />
samt kalder konstruktoren i superklassen for at få felterne navn og adresse initialiseret.<br />
Underklassen Ansat er abstrakt og tilføjer et lønkontonummer. Den skal også have en passende toString<br />
metode og konstruktor. Vi lader Ansat være abstrakt selvom at alle metoderne er implementeret.<br />
Underklasserne TAP (teknisk–administrativt personale) og VIP (videnskabligt personale) er konkrete udvidelser<br />
af Ansat. TAPere er repræsenteret tilstrækkeligt detaljeret ved egenskaberne der arves fra Ansat. VIPere er kendetegnet<br />
ved at de har undervisning på kurser, så giv hver VIP en tabel over navnene på de kurser han eller hun underviser<br />
på. Forsyn både TAP og VIP med passende konstruktorer og toString metoder. Vink: toString metoden for en<br />
VIP er lidt mere kompliceret end de andre toString metoder idet indholdet af kursustabellen også skal med i den<br />
tegnstreng der returneres. Du skal altså bruge en løkke i toString metoden. Derudover skal konstruktoren for en<br />
VIP tage en kursustabel som argument.<br />
Skriv en metode static void udskriv(<strong>IT</strong>CPerson[] ps) der givet en tabel af <strong>IT</strong>C-personer kan udskrive<br />
den (brug toString). Brug metoden i et program der opretter og udskriver en tabel af studerende, TAPere og<br />
VIPere (mindst én person af hver slags).<br />
Du kan f.eks. bruge følgende klasse til at teste dine personklasser:<br />
public class Java62 {<br />
static void udskriv(<strong>IT</strong>CPerson[] ps) {<br />
// Skriv din kode her<br />
}<br />
}<br />
public static void main(String[] args) {<br />
Studerende stud = new Studerende("Lene Hallenberg", "Øresundsvej 82, 3. tv.", 1);<br />
TAP tap = new TAP("Niels Hallenberg", "Øresundsvej 82, 3. tv.", "234-223423");<br />
String[] vip_kurser = {"<strong>Grundlæggende</strong> <strong>Programmering</strong>", "Konstruktion af <strong>IT</strong> og medier"};<br />
VIP vip = new VIP("Hugo Thorsen", "Hulteager 3, 4. tv.", "234-234234", vip_kurser);<br />
<strong>IT</strong>CPerson[] itc_personer = {stud, tap, vip};<br />
}<br />
System.out.println(stud.toString());<br />
System.out.println(tap.toString());<br />
System.out.println(vip.toString());<br />
udskriv(itc_personer);<br />
2
som f.eks. kan give følgende uddata<br />
Stud. Lene Hallenberg, Øresundsvej 82, 3. tv.. Stud. id: 1<br />
TAP. Niels Hallenberg, Øresundsvej 82, 3. tv.. Lønkonto: 234-223423<br />
VIP. Hugo Thorsen, Hulteager 3, 4. tv.. Lønkonto: 234-234234<br />
Kursus 0: <strong>Grundlæggende</strong> <strong>Programmering</strong><br />
Kursus 1: Konstruktion af <strong>IT</strong> og medier<br />
Nu udskrives tabellen:<br />
Stud. Lene Hallenberg, Øresundsvej 82, 3. tv.. Stud. id: 1<br />
TAP. Niels Hallenberg, Øresundsvej 82, 3. tv.. Lønkonto: 234-223423<br />
VIP. Hugo Thorsen, Hulteager 3, 4. tv.. Lønkonto: 234-234234<br />
Kursus 0: <strong>Grundlæggende</strong> <strong>Programmering</strong><br />
Kursus 1: Konstruktion af <strong>IT</strong> og medier<br />
Opgave Java63 — en grænseflade for sorterbare ting<br />
Denne opgave er noget vanskelig, da løsningen på en gang indeholder elementer vedrørende synlighed (private og<br />
public), type konvertering (‘type cast’) og klassegrænseflader (‘interfaces’). Til gengæld er opgaven meget lærerig.<br />
I denne opgave skal der defineres og anvendes en grænseflade (interface) der gør at klasser der implementerer<br />
grænsefladen kan sorteres. Da sortering er et helt emne for sig skal der bare laves en metode der undersøger om en<br />
tabel af sorterbare objekter allerede er sorteret. Her er en metode der returnerer true hvis en tabel af heltal er sorteret<br />
og false hvis bare et element i tabellen er mindre end det foregående element:<br />
static boolean sorted(int a[]) {<br />
for(int i=1; i < a.length; i=i+1)<br />
if (a[i] < a[i-1]) return false; // a er ikke sorteret på plads i og i-1<br />
return true; // sorteret på alle pladser.<br />
}<br />
Definer en grænseflade Sortable med en metode lessThan, der er public og returnerer en boolean. Metoden<br />
skal i klasser der implementerer grænsefladen defineres således at for to Sortable-objekter s1 og s2 svarer<br />
s1.lessThan(s2) til testen s1
}<br />
public static void main(String[] args) {<br />
SortableTime t1 = new SortableTime(12, 0);<br />
SortableTime t2 = new SortableTime(12, 15);<br />
SortableTime t3 = new SortableTime(12, 45);<br />
}<br />
SortableTime[] sorted = {t1, t2, t3};<br />
SortableTime[] un_sorted = {t1, t3, t2};<br />
System.out.println("Sorted(true): " + sorted(sorted));<br />
System.out.println("Un-sorted(false): " + sorted(un_sorted));<br />
som f.eks. kan give følgende uddata:<br />
Sorted(true): true<br />
Un-sorted(false): false<br />
Opgave Java64 — et hierarki af figurer<br />
I denne opgave skal defineres et hierarki af objekter der kan anvendes til at lave tegninger. Opgaven er noget omfattende,<br />
men den giver megen øvelse og forstand. Hierarkiet skal bestå af klasserne Shape, Rectangle, Circle, Line og<br />
Compound (start evt. med at udelade Compound; har du fået styr på de andre ting er den nem at få med bagefter):<br />
Klassehierarki af figurer<br />
Shape<br />
Rectangle Circle Line Compound<br />
Stiplede kasser repræsenterer abstrakte klasser.<br />
Klassen Shape skal være en abstrakt klasse der erklærer følgende abstrakte metoder:<br />
void draw(Graphics g) – tegn figuren på det givne Graphics objekt.<br />
void move(int deltax, int deltay) – flyt figuren det givne antal pixels.<br />
Shape copy() – producerer en identisk kopi af figuren.<br />
De forskellige konkrete figurer er definerede ved følgende egenkaber (som også er de argumenter man bruger i deres<br />
konstruktorer):<br />
Rectangle har et øverste venstre hjørne (x,y) samt en bredde og en højde:<br />
Rectangle(int x, int y, int bredde, int højde)<br />
Du kan bruge metoden drawRect i klassen Graphics til at tegne kassen. Metoden move skal opdatere placeringen<br />
x og y af kassen. Metoden copy skal returnere en kopi af objektet (se evt. metoden plus i eksempel<br />
Time4.java fra forelæsning 5).<br />
Circle har et centrum (x,y) samt en radius:<br />
Circle(int x, int y, int radius)<br />
En cirkel tegnes med metoden drawOval i klassen Graphics.<br />
Line har to endepunkter (x1,y1) og (x2,y2):<br />
Line(int x1, int y1, int x2, int y2)<br />
4
En linie tegnes med metoden drawLine i klassen Graphics.<br />
Compound er en Shape sammensat af to andre, s1 og s2:<br />
Compound(Shape s1, Shape s2)<br />
Et sammensat (eng. compound) objekt tegnes ved at tegne de to objekter som er sat sammen – hvert objekt har<br />
jo deres egen draw metode. Et sammensat objekt flyttes ved at flytte de to sammensatte objekter. Et sammensat<br />
objekt kopieres ved at returnere et nyt sammensat objekt indeholdende en kopi af de to sammensatte objekter.<br />
Alle koordinater og størrelser skal være heltal. Du skal huske at skrive import java.awt.*; i starten af dit<br />
program.<br />
Hent appletten Train i filen Train.java fra de vejledende løsninger på kursushjemmesiden, og oversæt den.<br />
Den skulle gerne kunne oversættes med det Shape-hierarki du har defineret. Hent også filen Train.html og kør<br />
appletviewer Train.html. Du skulle gerne se et lille futtog med to vogne (du kan se hvordan det burde se ud<br />
ved at køre Train.html direkte fra hjemmesiden).<br />
Opgave Java65 — et hierarki af litteratur<br />
I denne opgave skal du modellere et lille hierarki af litteratur som består af bøger og blade. Du kan udvide hierarkiet<br />
til også at indeholde aviser, brochurer m.m.<br />
Klassehierarki af litteratur<br />
Litteratur<br />
Blad Bog<br />
Stiplede kasser repræsenterer abstrakte klasser.<br />
Øverst i hierarkiet har vi en klasse Litteratur som er abstrakt. Fællestræk ved al litteratur er at der er en titel. Den<br />
konkrete klasse Blad indeholder desuden information om årgang, nr, dato og pris. Den konkrete klasse Bog indeholder<br />
desuden information om forfatter og forlag.<br />
Klasserne skal udover en konstruktor indeholde metoden public String toString() som returnerer en<br />
pænt formatteret tegnstreng med indholdet af objektet.<br />
Du kan f.eks. afprøve dit klassehierarki med følgende klasse:<br />
public class Java65 {<br />
public static void main(String[] args) {<br />
Litteratur l1 = new Blad("Alt om Data", "18", "1",<br />
"23/12-1999", 59.5);<br />
Litteratur l2 = new Bog("Java Software Solutions",<br />
"John Lewis og William Loftus",<br />
"Addison-Wesley 1998");<br />
System.out.println(l1);<br />
System.out.println(l2);<br />
}<br />
}<br />
som giver følgende uddata:<br />
Blad: Titel: Alt om Data<br />
Årgang: 18<br />
Nr: 1<br />
Dato: 23/12-1999<br />
Pris: 59.5<br />
Bog: Titel: Java Software Solutions<br />
Forfatter: John Lewis og William Loftus<br />
Forlag: Addison-Wesley 1998<br />
5