sommen

advertisement
Werkcollege Imperatief Programmeren
Week 13 – 15 mei 2007
1. Listeners zoals WindowListener en ActionListener zijn in Java als interface gedefinieerd. Kunnen we ze misschien ook net zo goed als klasse definieren? (en waarom?)
2. Hier is een Hallo Bob applicatie, gedefinieerd via een klasse StdFrame. De
import lijsten zijn van de code verwijderd.
public class StdFrame extends Frame implements WindowListener {
public StdFrame(){ }
public
public
public
public
public
public
public
void
void
void
void
void
void
void
windowClosing (WindowEvent e){System.exit(0);}
windowOpened (WindowEvent e){}
windowClosed (WindowEvent e){}
windowActivated (WindowEvent e){}
windowDeactivated (WindowEvent e){}
windowIconified (WindowEvent e){}
windowDeiconified (WindowEvent e){}
}
public class HalloBob extends StdFrame {
public HalloBob(){ addWindowListener(this); }
public void paint(Graphics g){
g.drawString("Hallo Bob",100,100);
}
public static void main(String[] params) {
HalloBob app = new HalloBob() ;
app.setVisible(true) ;
}
}
(a) De klasse StdFrame is hier niet echt nodig; geef een situatie waar het
wel nuttig is
(b) Is het in de situatie die je boven beschrijft misschien handiger om StdFrame
als een interface te hebben? (en leg uit)
(c) Is het zinnig om StdFrame als een abstract class te declareren? (en
leg uit)
1/3
zie andere kant
Werkcollege Imperatief Programmeren − Week 13 – 15 mei 2007
3. Stel dat wij een Java game willen schrijven die dieren simuleert. De activiteiten van een dier zijn slapen of eten (dus een dier-object heeft methoden
slaap en eet nodig). We hebben apen en krokodillen als dieren. Apen eten
bananen, en krokodillen eten bananen en apen. Een krokodil kan ook, als een
activiteit, zwemmen. Van een voer object (zoals een banaan) wil je ook een
methode hebben die de caloriewaarde van het object terug geeft. De game
heeft intern ook een array van dier en voer objecten. Voor het tekenen op
het scherm moeten deze objecten ook een draw methode hebben.
Aan de hand van bovenstaande tekst, geef een ontwerp van je game. Dwz:
(a) Wat zijn de klassen die je minimaal nodig hebt?
(b) Welke methoden hebben de klassen nodig?
(c) Welke klassen kun je beter als subklassen van andere declareren?
(d) Is het misschien handig om sommige klassen als interface te hebben? Of
misschien als abstracte klassen?
4. Hieronder zie je klassen Stad, HoofdStad, en Land. Stad en HoofdStad lijken
veel op elkaar: ze hebben dezelfde variabelen en beide hebben de methode
code. De laatste retourneert de eerste 4 letters van een (hoofd-) stad.
Een HoofdStad x heeft echter nog een methode: totInwoners. Een Land
heeft ook totInwoners. Voor een land geeft totInwoners het aantal inwoners van het land terug; voor een hoofdstad x geeft totInwoners het aantal
inwoners van het land waarvan x de hoofdstad is.
Hier is de code; de import lijsten zijn van de code verwijderd.
public class Stad {
public String naam;
public int inwoners;
public Land land;
//
//
//
//
Naam van de stad
Aantal inwoners
Zoals Nederland is het land waar
Utrecht is
public Stad(String n, int i){naam=n; inwoners=i;}
public String code(){ return naam.substring(0,3); }
}
public class HoofdStad {
public String naam;
public int inwoners;
public Land land;
//
//
//
//
Naam van de stad
Aantal inwoners
Het land waarvan dit object de
hoofdstad is
public HoofdStad(String n, int i){naam=n; inwoners=i;}
2/3
=⇒
Werkcollege Imperatief Programmeren − Week 13 – 15 mei 2007
public String code(){ return naam.substring(0,3); }
// Retourneer het aantal inwoners van het land waarvan
// deze stad de hoofdstad is.
// Aanname: land is niet null.
public int totInwoners() { return land.inwoners; }
}
public class Land {
public String naam;
// Naam van het land
public int inwoners;
// Aantal inwoners
LinkedList<Stad> steden; // De steden in het land
HoofdStad hstad;
// i is het aantal inwoners in het land die niet in
// de steden wonen.
// Aanname: je moet eerst een hoofdstad maken voor je
// een land maakt.
public Land(String n, int i, HoofdStad h){
naam=n;
inwoners=i + h.inwoners ;
steden = new LinkedList<Stad>();
hstad=h;
h.land = this;
}
// aanname: s is niet in steden
public void voegStad(Stad s){
steden.add(s);
s.land = this;
inwoners = inwoners + s.inwoners;
}
// Retourneer het aantal inwoners van het land
public int totInwoners() { return inwoners; }
}
(a) De code van Stad, HoofdStad, en Land bevat duplicatie. Ga ze eerst
herontwerpen en herschrijven. Voeg waar nodig extra klassen en/of interfaces toe. Denk aan het once and only once principe; dus dat je code
duplicatie tot een minimum beperkt.
(b) Schrijf een applicatie waarin een array a van een mix van hoofdsteden
en landen zit en die van ieder object x in a zijn totInwoners op het
scherm print.
3/3
Download