IMP Uitwerking week 13



Vergelijkbare documenten
Abstracte klassen & Interfaces

Zelftest Programmeren in Java

Overerving & Polymorfisme

public Paneel() { knop = new JButton( Klik ); knop.addactionlistener( new KnopHandler() ); tekstvak = new JTextField(10); add(knop); add(tekstvak);

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden.

Programmeren in C# Interfaces. Hoofdstuk 23

Omschrijf bij ieder onderdeel van de methode de betekenis ervan. Java kent twee groepen van klassen die een GUI kunnen maken: awt en swing.

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing

Game of Life in Java


Wat is een grafische gebruikersinterface (GUI)?

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

Ingebouwde klassen & methodes

Tentamen Imperatief Programmeren

VI. Klassen en objecten

Modelleren en Programmeren

NAAM: Programmeren 1 Examen 21/01/2011

Kleine cursus PHP5. Auteur: Raymond Moesker

Modelleren en Programmeren

Imperatief Programmeren, derde deeltentamen (INFOIMP) 4 november 2005

Modelleren en Programmeren

Design patterns Startbijeenkomst

Modelleren en Programmeren

Een stoomcursus door Edgar de Graaf, november 2006

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

public Bier ( string N, double P, Brouwerij B) { Naam = N; AlcoholPerc = P; Brouwer = B;

Programmeren in C# Overerving

Java spiekbrief. Commentaar. Definitie van een methode. Types. Variabelendeclaratie. Definitie van een klasse. Namen. Definitie van een veld

Informatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele

Stacks and queues. Hoofdstuk 6

Java spiekbrief. Commentaar. Definitie van een methode. Types. Variabelendeclaratie. Definitie van een klasse. Namen. Definitie van een veld

Tentamen Inleiding Programmeren (IN1608WI), 2 februari 2012, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces.

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

Modelleren en Programmeren

Ontwerp van Informatiesystemen

TENTAMEN Programmeren 1 VOORBEELDUITWERKING

Versie 2: B C D D A C D A C C. Versie 3: C D A A B D A B D D. Versie 4: A D C C B D C B D D. Versie 5: B A D D C A D C A A

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

TENTAMEN Programmeren 1 VOORBEELDUITWERKING

OBJECT SPAGHETTI : PATTERNS BIEDEN UITKOMST? Wat is het probleem nou eigenlijk? public class CoffeeDrinker { private CoffeeProducer mycoffeeproducer;

Objectgeoriënteerd Programmeren: WPO 2a

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 7 november 2014, uur

Modeleren. Modelleren. Together UML. Waarvan maken we een model? overzicht les 14 t/m 18. ControlCenter 6.2

NAAM: Programmeren 1 Examen 29/08/2012

Noties Informatica. In java fungeren objecten als een model voor de elementen waarin een probleem kan worden opgesplitst

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

Scala. Korte introductie. Sylvia Stuurman

Lessen Java: Reeks 3. David Blinder Jan G. Cornelis

Zo vind u hierin de volgende documentatie over de klasse Applet: +----java.awt.panel java.applet.applet

Programmeren in Java 3

Programmeren 1 23 januari 2013 Prof. T. Schrijvers

Voor het bepalen van de getalswaarde van een string is een standaardmethode beschikbaar: n = Integer.parseInt(s);

Tentamen in2705 Software Engineering

INFITT01 - Internettechnologie WEEK 8

Programmeren I. 26 augustus Algemene Richtlijnen. Richtlijnen Programmeren 1

Technical Computing. Technical Computing Team emazing 1

Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 3 februari 2017, uur

1 Ontwerppatronen. 1.1 Het Command patroon

APPLICATIEBOUW 3E COLLEGE: OBJECT GEORIËNTEERD PROGRAMMEREN, METHODEN, PARAMETERS, SCOPE VAN VARIABELEN. Onderdeel van SmartProducts

Stap 1 Eenvoudig tekenprogramma maken In eerste instantie alleen 'freehand' curves Demo in de les

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

eerste voorbeelden in Java

Design patterns.

Tentamen Inleiding Programmeren (IN1608WI), duur van de toets 2 uur Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction

Programmeren in Java 3

Tentamen Programmeren in C (EE1400)

Voorbeeld: Simulatie van bewegende deeltjes

Programmeren in Java les 3

Klassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Transcriptie:

IMP Uitwerking week 13 Opgave 1 Nee. Anders moet bijvoorbeeld een venster applicatie een subklasse zijn van zowel Frame en WindowListener. Als de applicatie ook een button of een menu heeft, dan moet het ook een subklasse van ActionListener. In Java is dit niet mogelijk: een klasse kan slechts één (directe) superklasse hebben. Een klasse kan echter meerdere interfaces implementeren. Opgave 2 (a) De klasse StdFrame is een eigenlijk een Frame met een eenvoudige implementatie van de interface WindowListener, namelijk die de applicatie sluit bij een venstersluit event. Als je meerdere venster applicaties hebt (dwz, meerdere subklassen van Frame) die WindowListener op diezelfde wijze implementeren, dan is het handig om ze een subklasse van StdFrame te maken; want dan krijg je natuurlijk de implementatie van WindowListener zoals in StdFrame geërfd. (b) Nee. Je kunt het niet eens als een interface definiëren, want in een interface kun je de body van een methode niet definiëren. Je kunt alleen de header van methoden definiëren. (c) Dit is afhankelijk van hoe je StdFrame wilt gebruiken. Als de bedoeling van StdFrame slechts om een bepaalde default implementatie van een interface te definiëren is, dan zou je in de praktijk StdFrame altijd moeten uitbreiden (bijvoorbeeld om de paint van Frame te herdefiniëren). In dit geval is het zinnig om StdFrame als een abstract klasse te declareren. Opgave 3 (a) Hoeveel klassen je nodig hebt is afhankelijk van je ontwerp, maar in dit geval lijkt het redelijk om minimaal Aap, Krokodil, en Banaan als klassen te hebben. Daarnaast wil je misschien een paar superklassen introduceren, zodat klassen variabelen en methoden van zijn supperklassen kunnen erven (en dus code duplicatie verminderen). Hier is een mogelijk ontwerp: In dit ontwerp is het mogelijk om bijvoorbeeld de methode slaap slechts een keer in Dier te definiëren; Aap en Krokodil erven het gewoon van Dier. Echter, krijgen alle dieren (dus ook krokodillen) in dit ontwerp alle methoden van Voer. Dit is minder mooi, en zelfs misschien ongewenst, omdat in dit verhaal een krokodil geen voer is. We zullen straks een paar alternatieven zien. (b) Voor het bovenstaande ontwerp (geërfde methoden worden niet genoemd): 1

klasse DrawKlasse: public void draw (Graphics g) klasse Voer: public int caloriewaarde () klasse Banaan: geen klasse Dier: public void slaap() klasse Aap: public void eten(banaan v) klasse Krokodil: public void eten(banaan v) public void eten(aap v) public void zwem() (c) Het staat al in het diagram in (a). (d) Als de applicatie eigenlijk alleen maar apen, krokodillen, of bananen creëert, dan kunnen we ook Dier en Voer abstract maken. We kunnen ook kiezen om Voer als een interface te definiëren: Let op dat in dit ontwerp is een krokodil geen voer meer. Echter van Voer kunnen Banaan en Aap nu slechts de headers van de methoden van Voer erven. De definitie van een methode kan uit een interface niet worden geërfd (omdat een interface geen volledige definitie van methoden aanbiedt). Een ander alternatief is het volgende: 2

Hier blijft Voer een klasse, maar het geen superklasse (of subklasse) meer van Dier. Dit is goed voor Krokodil, maar niet voor Aap, omdat in dit verhaal een aap ook een voer is. Om dit op te lossen wordt een nieuwe klasse AapV toegevoegd die het voer gedrag van een aap implementeert. In een Aap object voegen wij een variabele (bijvoorbeeld eetmij) die een AapV object bevat. Dus via deze variabele kunnen we achterhalen hoe een aap zich gedraagt als voer. Opgave 4 (a) In deze oplossing wordt voor de volgende indeling van klassen gekozen: De variabelen naam en inwoners zijn aanwezig in alle klassen in het originele ontwerp. Daarom introduceren we in het nieuwe ontwerp een klasse Regio en verplaatsen we deze variabelen naar Regio. Omdat Land, Stad, en HoofdStad nu subklassen van Regio krijgen ze nu gratis deze variabelen mee. De constructoren van Stad en HoofdStad doen exact dezelfde. We kunnen hun gedrag nemen als de definitie van de constructor van Regio; dus krijgen Stad en HoofdStad deze (bijna) gratis zie de code onder. De methode code was aanwezig en identiek in Stad en HoofdStad. Deze verplaatsen we naar Stad; dus krijgt HoofdStad deze nu gratis. De methode totinwoners is in HoofdStad en Land aanwezig, maar zij doet in de ene klasse anders dan in de andere. Er is dus geen sprake van code duplicatie. Je kunt ze zo laten. Echter, met het oog op opgave (b) introduceren we ook een interface HeeftTotInwoners met totinwoners als zijn (enige) methode. Nu kun je bijvoorbeeld een array van HeeftTotInwoners objecten hebben; van deze objecten weet je dus dat ze de methode totinwoners hebben. abstract public class Regio{ public String naam; // naam van de regio public int inwoners; // aantal inwoners public Regio(String n, int i){naam=n; inwoners=i; import java.util.*; public class Land extends Regio implements HeeftTotInwoners { LinkedList<Stad> steden; // de steden in het land HoofdStad hstad; public Land(String n, int i, HoofdStad h){ super(n,i); hstad=h; steden = new LinkedList<Stad>(); voegstad(h); 3

// aanname: s is niet in steden public void voegstad(stad s){ steden.add(s); s.land = this; inwoners = inwoners + s.inwoners; public int totinwoners(){ return inwoners; public class Stad extends Regio { public Land land; // zoals Nederland is het land waar Utrecht is public Stad(String n, int i){ super(n,i); public String code(){ return naam.substring(0,3); public class HoofdStad extends Stad implements HeeftTotInwoners { public HoofdStad(String n, int i){ super(n,i); // Retourneer het aantal inwoners van het land waarvan // deze stad de hoofdstad is. // Aanname: land is niet null. public int totinwoners() { return land.inwoners; (b) public class InwonersApp { static public void printtotinwoners(heefttotinwoners[] w){ int s; for (int i=0; i<w.length; i++) { s = w[i].totinwoners(); if (s>=0) System.out.print("" + s + "\n"); else System.out.print("-\n"); ; // een demo van deze applicatie public static void main(string[] args){ Stad utrecht = new Stad("Utrecht",100000); Stad delft = new Stad("Delft",100000); HoofdStad ams = new HoofdStad("Amsterdam",1000000); Land nl = new Land("Nederland",19000000,ams); nl.voegstad(utrecht); nl.voegstad(delft); 4

HeeftTotInwoners[] w = new HeeftTotInwoners[2]; w[0] = ams; w[1] = nl; printtotinwoners(w); 5