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

Exercise solution 4.2
Klasserne Spillekort og KortSpil


Først klassen Spillekort fra den orindelige opgave:

public class Spillekort{

  // Farve konstanter:
  public final static int RUDER = 0;
  public final static int HJERTER = 1;  
  public final static int KLØR = 2;  
  public final static int SPAR = 3;  

  // Værdi konstanter: 
  public final static int KNÆGT = 11;  
  public final static int DRONNING = 12;  
  public final static int KONGE = 13;
  public final static int ES = 1;  

  private int farve;
  private int værdi;

  Spillekort(int farve, int værdi){
    this.farve = farve;
    this.værdi = værdi;
  }

  private String værdiPræsentation(){
    if (this.værdi == ES)            return ("Es");
    else if (this.værdi == KNÆGT)    return ("Knægt");
    else if (this.værdi == DRONNING) return ("Dronning");
    else if (this.værdi == KONGE)    return ("Konge");
    else return (Integer.toString(værdi));
  }

  private String farvePræsentation(){
    switch (this.farve) {
      case RUDER:    return("Ruder"); 
      case HJERTER:  return ("Hjerter");
      case KLØR:     return("Klør");
      case SPAR:     return("Spar");
      default: return("???");
    }
  }

  public String toString(){
    return(farvePræsentation() + " " + værdiPræsentation());
  }

  public boolean ligMed(Spillekort andetKort){
    return(this.farve == andetKort.farve && this.værdi == andetKort.værdi);
  }

  public boolean mindreEnd(Spillekort andetKort){
    int thisReelVærdi  = (this.værdi == 1) ? KONGE+1 : this.værdi;
    int andetKortReelVærdi = (andetKort.værdi == 1) ? KONGE+1 : andetKort.værdi;
    return(thisReelVærdi < andetKortReelVærdi);
  }

  public boolean størreEnd(Spillekort andetKort){
    return !(this.ligMed(andetKort) || this.mindreEnd(andetKort));
  }
}
 

Jeg laver en klasse KortSpil, som repræsenterer et helt spil kort:

public class KortSpil{
  
  public Spillekort[] bunke = new Spillekort[52];

  /* Lav et spil kort med 52 kort. */
  public KortSpil(){
    for(int f = Spillekort.RUDER; f <= Spillekort.SPAR; f++)
     for (int v = 1; v <= Spillekort.KONGE; v++){
       Spillekort kort = new Spillekort(f,v);
       bunke[f*13+(v-1)] = kort;
     }
  }

  /* Et hovedprogram som instantierer denne klasse og udskriver KortSpil objektets kort */
  public static void main(String[] args){
    KortSpil spil = new KortSpil();
    for (int i = 0; i < 52; i++)
      System.out.print(spil.bunke[i] + " ");
  }
}

Og nu til løsningen som har at gøre med indlejrede klasser.

Vi vælger en løsning hvor Spillekort er en indre statisk klasse i KortSpil. Dette understreger den samhørighed der er mellem kort begrebet og et helt spil kort, samtidig med at vi accepterer at enkeltkort kan eksisterer uafhængigt af helhedsobjektet.

Her er min løsning:

public class KortSpil{

  static public class Spillekort{
  
    // Farve konstanter:
    public final static int RUDER = 0;
    public final static int HJERTER = 1;  
    public final static int KLØR = 2;  
    public final static int SPAR = 3;  
  
    // Værdi konstanter: 
    public final static int KNÆGT = 11;  
    public final static int DRONNING = 12;  
    public final static int KONGE = 13;
    public final static int ES = 1;  
  
    private int farve;
    private int værdi;
  
    Spillekort(int farve, int værdi){
      this.farve = farve;
      this.værdi = værdi;
    }
  
    private String værdiPræsentation(){
      if (this.værdi == ES)            return ("Es");
      else if (this.værdi == KNÆGT)    return ("Knægt");
      else if (this.værdi == DRONNING) return ("Dronning");
      else if (this.værdi == KONGE)    return ("Konge");
      else return (Integer.toString(værdi));
    }
  
    private String farvePræsentation(){
      switch (this.farve) {
        case RUDER:    return("Ruder"); 
        case HJERTER:  return ("Hjerter");
        case KLØR:     return("Klør");
        case SPAR:     return("Spar");
        default: return("???");
      }
    }
  
    public String toString(){
      return(farvePræsentation() + " " + værdiPræsentation());
    }
  
    public boolean ligMed(Spillekort andetKort){
      return(this.farve == andetKort.farve && this.værdi == andetKort.værdi);
    }
  
    public boolean mindreEnd(Spillekort andetKort){
      int thisReelVærdi  = (this.værdi == 1) ? KONGE+1 : this.værdi;
      int andetKortReelVærdi = (andetKort.værdi == 1) ? KONGE+1 : andetKort.værdi;
      return(thisReelVærdi < andetKortReelVærdi);
    }
  
    public boolean størreEnd(Spillekort andetKort){
      return !(this.ligMed(andetKort) || this.mindreEnd(andetKort));
    }
  }
 
  
  public Spillekort[] bunke = new Spillekort[52];

  /* Lav et spil kort med 52 kort. */
  public KortSpil(){
    for(int f = Spillekort.RUDER; f <= Spillekort.SPAR; f++)
     for (int v = 1; v <= Spillekort.KONGE; v++){
       Spillekort kort = new Spillekort(f,v);
       bunke[f*13+(v-1)] = kort;
     }
  }

  /* Et hovedprogram som instantierer denne klasse og udskriver KortSpil objektets kort */
  public static void main(String[] args){
    KortSpil spil = new KortSpil();
    for (int i = 0; i < 52; i++)
      System.out.print(spil.bunke[i] + " ");
  }
}

Som man ser har vi blot indlejret klasserne, som var resultatet af opgaven fra forrige lektion. Intet mere - intet mindre.

Her er et meget simpelt eksempel på en applikation, som laver et SpilleKort:

// En simpel klasse som illustrerer at SpilleKort kan anvendes direkte og uden problemer
// selv om klassen er indlejret i klassen KortSpil.

class Application {

  static KortSpil.Spillekort k = new KortSpil.Spillekort(KortSpil.Spillekort.RUDER,3);

  public static void main (String[] args) {
    System.out.println(k);
  }
}

Man ser at det er lidt omstændeligt at referere til egenskaber i indre klasser. Derfor kan man med fordel bruge en import clause til at 'åbne op' for den indre klasse:

// En simpel klasse som illustrerer at SpilleKort kan anvendes direkte og uden problemer
// selv om klassen er indlejret i klassen KortSpil

import KortSpil.Spillekort;

class Application1 {

  static Spillekort k = new Spillekort(Spillekort.RUDER,3);

  public static void main (String[] args) {
    System.out.println(k);
  }
}