Et kvadrat er en specialisering af Rectangle. Hvis vi bruger 'is a testen' kan vi spørge om
et kvadrat er et rektangel? Det er det, naturligvis. Mængden af kvadrater er en delmængde
af mængden af rektangler. Altså bør Square arve fra Rectangle. Man kunne forsøge sig med et argument om at et rektangel udvider klassen kvadrat med en ny
sidelængde, og derved at Rectangle skal arve fra Square. Jeg mener dog helt klart, at dette
er et vildspor, som ikke bør forfølges nærmere. Hvis der er et godt argument for specialisering
komme udvidelses og programgenbrugs ideer i anden række. Her viser vi klassen Square: Bemærk at vi kun har behov for at lave en konstruktor i klassen, som udtrykker
hvilken super konstruktor i Rectangle, som skal anvendes. Vi afprøver programmet via SquareTest:public class Square extends Rectangle {
// no new instance variables
/** Construct a square from the upper left corner and a side length.*/
public Square(Point upperLeft, int sideLength){
super(upperLeft, sideLength, sideLength);
}
// All other methods are inherited
}
public class SquareTest{
public static void main(String[] args){
Square r1 = new Square(new Point(5,10), 4);
Square r2 = new Square(new Point(6,10), 5);
Square r3 = new Square(new Point(0,0), 0);
System.out.println("r1: " + r1);
System.out.println("r2: " + r2);
System.out.println("r3: " + r3);
System.out.println("Width of r1: " + r1.width() + " Height of r1: " + r1.height());
System.out.println("Width of r2: " + r2.width() + " Height of r2: " + r2.height());
// r2.moveRelative(3,0);
System.out.println("r1: " + r1);
System.out.println("r2: " + r2);
System.out.println("Overlap: " + r1.overlappingRectangle(r2));
}
}