Først klassen Spillekort fra den orindelige opgave: Jeg laver en klasse KortSpil, som repræsenterer et helt spil kort: 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: 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: 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: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 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] + " ");
}
}
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] + " ");
}
}
// 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);
}
}
// 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);
}
}