05.09.2013 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!