Compositie |
In dit voorbeeld wordt een vierkant klasse opgebouwd uit twee Punt klassen
// De klassedefinitie van Vierkant
public class Vierkant {
// stap1: compositie
protected Punt linksboven;
protected Punt rechtsonder;
// de constructor zonder argumenten
public Vierkant() {
linksboven = new Punt(0, 0);
rechtsonder = new Punt(1, 1);
}
// Constructor met argumenten
public Vierkant( int lbx, int lby, int rox, int roy ) {
// linksboven moet ECHT links en boven rechtsonder zitten
if (rox > lbx && roy > lby) {
linksboven = new Punt(lbx, lby);
rechtsonder = new Punt(rox, roy);
}
}
// de hoogte van het vierkant
public int hoogte() {
return (rechtsonder.getY() - linksboven.getY() );
}
// Geeft de breedte van het vierkant
public int breedte() {
return (rechtsonder.getX() - linksboven.getX() );
}
// berekent het oppervlak van het vierkant
public int oppervlakte() {
return hoogte() * breedte();
}
// converteert de Vierkant naar een String
public String toString() {
String temp = "linksboven = " + linksboven + " ; " ;
temp += "rechtsonder = " + rechtsonder;
return temp;
}
}
|
// TestVierkant.java hoort bij Vierkant.java
import java.awt.Graphics;
import java.applet.Applet;
public class TestVierkant extends Applet {
private Vierkant v1, v2;
public void init() {
v1 = new Vierkant (1, 1, 3, 3);
v2 = new Vierkant();
}
public void paint( Graphics g ) {
g.drawString( "v1: " + v1, 25, 40 ); // toString() wordt aangeroepen
g.drawString( "v2: " + v2, 25, 55 );
}
}
|
Zoals bij de Punt en Cirkel klasse krijgt de Vierkant klasse een volledige verzameling methoden. Opdat de datamember verborgen zijn, maar via de methoden te benaderen.
| Vierkant() | constructor zet alles op 0 |
| Vierkant(int x1, int y1, int x2, int y2) | constructor met argumenten |
| hoogte() | geeft de huidige hoogte van het vierkant |
| breedte() | geeft de breedte van het vierkant |
| oppervlakte() | geeft het oppervlak van het vierkant |
| toString() | converteert de Vierkant klasse naar een String |
stap1: compositie
Bij compositie bevat een klasse één of meerdere andere klassen.
Bij het aanroepen van een memberfunctie van de containerklasse
wordt vaak de uitvoering gedelegeerd aan de klasse binnen deze
klasse.
De klassen binnen deze klassen hebben geen overervingsrelatie met deze klasse, dus kunnen protected datamember niet rechtstreeks benaderd worden. Als alle klassen in dezelfde package (directory) zitten dan de datamember als package aangeduid kunnen worden, waardoor geen memberfuncties nodig zijn voor de toegang.
Deze relatie wordt in de analyse aggregatie genoemd. En komt vaker voor dan overerving. Sterker nog. Als er onzekerheid bestaat of er sprake is van compositie of overerving, is het verstandig voor compostie te kiezen.