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