Exercises in this lecture   Go to the notes, in which this exercise belongs -- Keyboard shortcut: 'u'   Alphabetic index   Course home   

Exercise solution 7.1
Opgave om kvadrater i forhold til rektangler


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:

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

}

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 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));

  }

}