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

Exercise solution 2.3
Lighed mellem bankkonti


Mit program, som løser problemet, er følgende:

class Konto {
   private double rentesats;
   private String navn;
   private double saldo;

   public Konto(String ejer) {
      rentesats = 0.02;
      navn = ejer; 
      saldo = 0;
   }

   public double balance () {
      return saldo;
   }

   public void hæv (double beløb) {
      saldo = saldo - beløb;
   }

   public void indsæt (double beløb) {
      saldo = saldo + beløb;
   }         

   public void tilskrivRente() {
      saldo = saldo + saldo * rentesats;
   }

   public boolean equals(Object other){
     if (other instanceof Konto){
       String thisLcNavn = navn.toLowerCase();
       String otherLcNavn = ((Konto)other).navn.toLowerCase();
       return
         this.saldo == ((Konto)other).saldo &&
          thisLcNavn.equals(otherLcNavn);
       }
     else return false;
   }

   public String toString() {
      return navn + "'s konto indeholder "
            + saldo + " kroner";
   }
} // End Konto



class BankEquals {
 
   public static void main( String[] args ) {

     Konto konto1 = new Konto("PETER");
     Konto konto2 = new Konto("Peter" ); 
     String str = "Mogens";

     konto1.indsæt(100);
     konto2.indsæt(101);
     System.out.println(konto1);  System.out.println(konto2);

     if (konto1.equals(konto2))
       System.out.println("Konto1 og konto2 er ens");
     else
       System.out.println("Konto1 og konto2 er forskellige");

     if (konto1.equals(str))
       System.out.println("Her er vist noget galt...");
     else
       System.out.println("En konto og en streng kan aldrig være lig med hinanden");
 
   }
}

Her er et link til programmet.Bemærk for det første, at vi vælger at lade other være at typen Object, og ikke Konto. Herved opnår vi at equals virkelig 'overrider' equals fra Object. Hvis vi valgte definitionen:

    public boolean equals(Konto other){ ... }
ville der være tale om en ny definition løsrevet fra metoden i Object.

Det skal også bemærkes at på trods af at både instansvariablene navn og saldo er private, så kan vi i equal se other's private instansvariable. Årsagen er, at det private relaterer sig til klassen - ikke de individuelle objekter. En privat egenskab i et objekt af klassen Konto kan altså ses fra alle andre Konto objekter.

Vi kunne også overveje at aflæse egenskaberne i den anden konto, other, via de offentlige metoder i klientgrænsefladen. Det har vi dog ikke gjort i vores implementation.

Bemærk også at vi returnerer false hvis other ikke er en Konto. Den generelle type af other tillader os f.eks. at afvise lighed mellem en Konto og et String objekt.