Konstruktoren

johannesK

Mitglied
In einer Übungsaufgabe sollen verschiedene Varianten von Minesweeper implementiert werden. Ich habe also eine Oberklasse MinesweeperGame und verschiedene Unterklassen (MinesweeperGameOrig, MinesweeperGameDiag, ..... ). In der Benutzerschnittstelle soll nun zu spielbeginn entschieden werden können welche variante man spielen möchte. Ich habe versucht das so zu lösen :

Java:
....
int mode;
// mode wird eingelesen über benutzerschnittstelle ...
  
    if (mode == 1) {
        MinesweeperGameOrig msg = new MinesweeperGameOrig(10,10,10,10);
    }
    if (mode == 2) {
        MinesweeperGameDiag msg = new MinesweeperGameDiag(10,10,10,10);
    }
    if (mode ==3) {
        MinesweeperGameOrtho msg = new MinesweeperGameOrtho(10,10,10,10);
    }
    ...
    ...

msg.open(3,3);
msg.mark(4,7);

Die verschiedenen varianten sollen alle den gleichen namen haben, damit ich die funktionen des spiels (spielfeld öffnen, fahne setzen, .... ) nicht für alle varianten explizit angeben muss (sondern eben nur msg.open() , msg.mark() ...) .

So wie es oben geschrieben steht kommt der Fehler: Cannot find Symbol: variable msg.

Ich habe es auch schon mit Hilfe einer switch anweisung versucht auch das hat leider nicht funktioniert.

Wie kann ich abhängig von der Eingabe des benutzers ein Objekt mit dem namen msg mit variierendem typ (spielvarianten) erzeugen???

Vielen Dank für die Hilfe

Johannes
 

L-ectron-X

Gesperrter Benutzer
Code:
msg
wird innerhalb einer if-Abfrage initialisiert. Außerhalb der Abfrage ist
Code:
msg
aber nicht mehr existent.
Du musst also die Variable oberhalb der if-Abfrage deklarieren.

Java:
MinesweeperGame msg = null;
 

Landei

Top Contributor
Du kannst nur den Typen der Oberklasse angeben, ungefähr so:

Java:
MinesweeperGame msg = null;
switch (mode) {
  case 1: msg = new MinesweeperGameOrig(10,10,10,10); break;
  case 2: msg = new MinesweeperGameDiag(10,10,10,10); break;
  case 3: msg = new MinesweeperGameOrtho(10,10,10,10); break;
  default: throw new IllegalArgumentException("WTF?!?");
}
msg.open(3,3);
msg.mark(4,7);

Wenn deine Spielklassen weitgehend gleich sind, kannst du auch versuchen, nur das jeweils unterschiedliche Auswertungsverhalten u.s.w. zu kapseln, und die entsprechende "Strategie" deinem Spiel-Objekt zu übergeben:

Java:
Strategy strat = OrigStrategy(); //oder halt eine andere
MinesweeperGame msg = new MinesweeperGame(strat, 10, 10, 10, 10);

Das ist gewöhnlich die bessere Wahl, wenn die Unterschiede zwischen den Versionen nicht sehr groß sind.
 
Zuletzt bearbeitet:

turtle

Top Contributor
Dafür gibt es in Java Interfaces!

Alle Methoden, die Du in den speziellen Unterklassen benötigst, kommen in ein Interface. Die Unterklassen implementieren dieses. Dann kannst Du Deinen Code so umschreiben:
Java:
int mode;
// mode wird eingelesen über benutzerschnittstelle ...
  MinesweeperGame msg = null; // Dies ist das Interface gegen das Du programmierst
    if (mode == 1) {
        msg = new MinesweeperGameOrig(10,10,10,10); 
    }
    if (mode == 2) {
        msg = new MinesweeperGameDiag(10,10,10,10); 
    }
    if (mode ==3) {
        msg = new MinesweeperGameOrtho(10,10,10,10);
    }
    ...
    ...
 
msg.open(3,3);
msg.mark(4,7);
Und Dein Interface sieht zum Beispiel so aus:
Java:
public interface MinesweeperGame {
   public void open(int a, int b);
   public void mark(int c, int d);
   ...

}
 

johannesK

Mitglied
Danke für die schnelle Antwort ... das funktioniert für die methoden der Oberklasse so auch (msg.mark() zB (eine Fahne setzten ist in allen Minesweeper varianten das gleiche)). Nur wenn ich jetzt ein feld öffnen will mit msg.open() (die methode ist in der unterklasse, da sich die varianten ja gerade im aufdecken der felder unterscheiden) dann geht das leider nicht {cannot find symbol: method open(int,int) }

Gibt es eine möglichkeit die methoden der unterklasse zu erreichen ??

Vielen Dank

Johannes
 
Zuletzt bearbeitet:

turtle

Top Contributor
Wenn Du meinem Vorschlag gefolgt bist und eine Methode im Interface deklariert hast, MUSS diese in den implementierenden Klassen implementiert werden!. Dann kann es auch nicht zu Deinem Problem kommen.

Wenn das für eine konkrete Klasse keinen Sinn macht, kann eine leere Implementierung helfen, oder eine Runtime-Exception geworfen werden, oder, oder.
 

Landei

Top Contributor
Du kannst entweder ein Interface verwenden:

Java:
public interface MinesweeperGame {
    public void open();
}

public class MinesweeperGameOrig implements MinesweeperGame {
    public void open(){ ... }
}

Allerdings kannst du in einem Interface "gemeinsame" Methoden wie mark nicht definieren. Eine Lösungsmöglichkeit ist die Verwendung abstrakter Klassen:
Java:
public abstract class MinesweeperGame {
    public abstract void open(); //muss in Unterklasse implementiert werden
    public void mark(){ ... } //ganz normale Methodendefinition
}

public class MinesweeperGameOrig extends MinesweeperGame {
    public void open(){ ... }
}
 

turtle

Top Contributor
Man kann auch eine (abstrakte) Adapter-Klasse bauen, die das Interface implementiert.

Unterklassen erben dann von der Adapter-Klasse und müssen nur die Methoden überschreiben wo das Verhalten anders ist als in der Adapterklasse.

Diese Entscheidung würde ich echt davon abhängig machen, wie viel Code in allen Klassen gleich ist.

Sorry, erstens bin ich ein Fan von Programmierung gegen Interfaces und wollte dem OP dies näherbringen (SCNR)
 

Crian

Top Contributor
Ich bin auch für Programmieren gegen Schnittstellen. Dies sollte man aber nicht mit Interfaces gleich setzen. Wichtig ist doch dabei, dass man nicht gegen eine konkrete Klasse programmiert. Ob hinter dem verwendeten Typ ein Interface oder eine (ggf. sogar abstrakte) Oberklasse steckt, tut der Programmierung gegen Schnittstellen keinen Abbruch.

Aus "Entwurfsmuster von Kopf bis Fuß" (4. korrigierter Nachdruck 2008 S. 12)
"Auf eine Schnittstelle programmieren" heißt eigentlich "Auf einen Supertyp programmieren".

[...]

Mit dem deutschen Wort Schnittstelle verweisen wir auf das allgemeine Konzept Schnittstelle (die nach außen sichtbare Seite einer Komponente, über die die Interaktion mit der Komponente gesteuert wird) [...]

Man kann also auf eine Schnittstelle programmieren, ohne dazu tatsächlich ein Java-Interface verwenden zu müssen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Verschiedene Konstruktoren mit gleichen Datentypen Java Basics - Anfänger-Themen 8
C Konstruktoren und Variablen Java Basics - Anfänger-Themen 42
lougoldi Verkettung von Methoden und Konstruktoren Java Basics - Anfänger-Themen 4
J Konstruktoren und Grafik Java Basics - Anfänger-Themen 3
A Cannot find symbol mit Konstruktoren Java Basics - Anfänger-Themen 27
L Brauche Hilfe beim arbeiten mit Konstruktoren Java Basics - Anfänger-Themen 20
C Objekte und Konstruktoren Java Basics - Anfänger-Themen 2
M Methodenaufrufe im Konstruktoren Java Basics - Anfänger-Themen 31
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
M Vererbung Konstruktoren mit festen Werte Java Basics - Anfänger-Themen 2
F Mehrere Konstruktoren? Wofür? Java Basics - Anfänger-Themen 21
J Konstruktoren in Initialisierungsblöcke Java Basics - Anfänger-Themen 6
T Konstruktoren Java Basics - Anfänger-Themen 25
D was bedeutet this. bei Konstruktoren? Java Basics - Anfänger-Themen 4
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
C Die Klasse Menge mit Konstruktoren und einfachen Methoden Java Basics - Anfänger-Themen 5
F Mehrere Konstruktoren Java Basics - Anfänger-Themen 10
G Was ist der Nutzen von generischen Konstruktoren? Java Basics - Anfänger-Themen 4
Q Methoden Konstruktoren anlegen Java Basics - Anfänger-Themen 5
B Objekte in Konstruktoren übergeben Java Basics - Anfänger-Themen 5
D Zähler nicht sichtbar (Thema: Konstruktoren) Java Basics - Anfänger-Themen 2
A Überladen von Konstruktoren Java Basics - Anfänger-Themen 2
V Konstruktoren Java Basics - Anfänger-Themen 15
C Klassen StackOverflow bei erster Nutzung von Klassen/Konstruktoren Java Basics - Anfänger-Themen 9
F Konstruktoren Java Basics - Anfänger-Themen 4
M Erste Schritte Verständnis Problem Konstruktoren Java Basics - Anfänger-Themen 13
Y Klassen, Vererbung, Konstruktoren Java Basics - Anfänger-Themen 13
B Klassen Unterschied Konstruktoren. Java Basics - Anfänger-Themen 3
C Erste Schritte Konstruktoren verstehen Java Basics - Anfänger-Themen 7
W OOP Konstruktoren Erklärung Java Basics - Anfänger-Themen 14
N Abarbeitungsreihenfolge von Konstruktoren Java Basics - Anfänger-Themen 12
O Klassen und Konstruktoren Java Basics - Anfänger-Themen 7
V Konstruktoren -> Funktionsaufrufe Java Basics - Anfänger-Themen 7
Q Konstruktoren und Methoden Java Basics - Anfänger-Themen 2
C Konstruktoren Java Basics - Anfänger-Themen 7
M Konstruktoren & Veerbung Java Basics - Anfänger-Themen 6
T Konstruktoren Java Basics - Anfänger-Themen 6
P Enum Attribut in Konstruktoren Java Basics - Anfänger-Themen 10
R Vererbung Konstruktoren nicht erkannt Java Basics - Anfänger-Themen 17
H Klassen, Konstruktoren, Instanzen etc Java Basics - Anfänger-Themen 6
J OOP Konstruktoren, setMethode, getMethode usw. Java Basics - Anfänger-Themen 7
A überladene Konstruktoren Java Basics - Anfänger-Themen 7
L Frage zu Konstruktoren und dem this Operator Java Basics - Anfänger-Themen 16
W 2 Konstruktoren Java Basics - Anfänger-Themen 8
B Vererbung und Konstruktoren Java Basics - Anfänger-Themen 33
N Vererbung von Konstruktoren mit Parametern Java Basics - Anfänger-Themen 7
S Konstruktoren verketten Java Basics - Anfänger-Themen 6
A Konstruktoren sollen sich gegenseitig aufrufen Java Basics - Anfänger-Themen 10
B Konstruktoren Sichtbarkeit Java Basics - Anfänger-Themen 2
K Kann man Private-Konstruktoren doch aurufen? Java Basics - Anfänger-Themen 8
E Konstruktoren und Methoden Java Basics - Anfänger-Themen 10
E OOP individual + standard-Konstruktoren Java Basics - Anfänger-Themen 9
S Konstruktoren? Java Basics - Anfänger-Themen 5
K Konstruktoren Java Basics - Anfänger-Themen 13
H Konstruktoren – super! Java Basics - Anfänger-Themen 3
L Geschachtelte Konstruktoren Java Basics - Anfänger-Themen 4
hdi Kleine Design/Convention Frage zu Konstruktoren Java Basics - Anfänger-Themen 4
J Vererbung und Konstruktoren Java Basics - Anfänger-Themen 14
J Problem mit Konstruktoren Java Basics - Anfänger-Themen 2
G Überladen von Konstruktoren mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 4
H Befehl mit Konstruktoren Java Basics - Anfänger-Themen 2
L Konstruktoren bei Vererbung Java Basics - Anfänger-Themen 13
Z wie kann ich überladene Konstruktoren "umleiten"? Java Basics - Anfänger-Themen 11
D Blöde(?) Frage zu Konstruktoren und set-Methoden Java Basics - Anfänger-Themen 3
G Interface und Konstruktoren Java Basics - Anfänger-Themen 3
G Frage zu Konstruktoren Java Basics - Anfänger-Themen 12
G Verständnisfrage zu Konstruktoren Java Basics - Anfänger-Themen 5
G Konstruktoren Java Basics - Anfänger-Themen 9
A Konstruktoren überladen Java Basics - Anfänger-Themen 9
H Konstruktoren + Hilfe Java Basics - Anfänger-Themen 12
H Konstruktoren werden nie geerbt Java Basics - Anfänger-Themen 3
O Vor-/Nachteile/Unterschiede von Konstruktoren und Methoden Java Basics - Anfänger-Themen 3
Bierhumpen 2 Konstruktoren Java Basics - Anfänger-Themen 15
T mehrere Konstruktoren für eine Klasse Java Basics - Anfänger-Themen 7
J Instantvariablen und Konstruktoren Java Basics - Anfänger-Themen 2
Y Vererben - Konstruktoren Java Basics - Anfänger-Themen 2
Z übergabe von string[] an konstruktoren oder methoden Java Basics - Anfänger-Themen 3
L Klassen, Vererbung und Konstruktoren Java Basics - Anfänger-Themen 10
S Frage zu Konstruktoren Java Basics - Anfänger-Themen 7
G Problem mit Gültigkeit von Variabeln und Konstruktoren Java Basics - Anfänger-Themen 4
C Konstruktoren Java Basics - Anfänger-Themen 4
G Konstruktoren (was, wozu, wieso, warum) Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben