Rollen verändern, Interfaces austauschen wie?

skuki

Aktives Mitglied
Hallo,

ich stehe gerade vor einem lästigen Problem, für das ich leider noch nichts passendes gefunden habe :rtfm:


Ich habe eine Roboterklasse von der es zwei verschiedene Typen gibt.

JumpRoboter (zählt Sprünge) und Driveroboter(zählt Weglänge). (Soweit so gut)

Diese Jump bzw. Driveroboter können jetzt aber noch verschiedene Aufsätze erhalten. Bei diesen Aufsätzen handelt es sich entweder um eine Kamera (int Pixel kommt hier hinzu) oder um einen Bohrer (double length) kommt hinzu.

Jetzt denke ich man wird dass mit einem Interface schön lösen können, jedoch kann man die Aufsätze auch austauschen.

Ein JumpRoboter mit Kamera, darf aber keine Bohrerlänge besitzen und umgekehrt, daher kann ich auch nicht im Vorhinein beide Variablen in eine Klasse geben.


Jetzt war ich so dreist und unerfahren dass ich einfach eine adoptTo() Methode geschrieben habe die ein neues Objekt der anderen Klasse erstellt und sie der alten Referenz zum Überschreiben mitgibt. Funktioniert natürlich nicht :oops:


Wie löst man dieses Problem?

Vielen vielen Dank!!
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Du könntest eine abstrakte Klasse AbstractAufsatz oder ein Interface Aufsatz erstellen. Diese Klasse oder dieses Interface bietet alle Methoden, die es bei beiden Aufsätzen gibt, sodass die Roboter gar nicht wissen, was sie da eigentlich für einen Aufsatz haben.
Wenn sich die beiden Aufsätze doch so stark unterscheiden, kannst du noch mit instanceof überprüfen, welchen Aufsatz die Roboter haben und somit aufsatzspezifische Methoden aufrufen.

Wie du das machst, dass ein Roboter keine zwei Aufsätze hat: Es gibt nur eine Variable, die einen Aufsatz enthalten kann.
 

skuki

Aktives Mitglied
Danke das ist schon mal ein guter Tipp.

Das Problem ist dass es diese 4 Klassen geben muss.

JumpingRobotDrill
JumpingRobotCamera
DrivingRobotDrill
DrivingRobotCamera


Alle diese Roboter werden in einer Raumsonde gespeichert und über diese können die "Aufsätze" ausgetauscht werden.

Nur wie soll eine Klasse x zur Klasse y werden?

Oder den Listenplatz X1 einfach mit der neuen Klasse mit der gleichen ID überschreiben?
 

kaoZ

Top Contributor
Ich weiß nicht ob ich dich richtig verstanden habe , demnach auch nicht ob dir das hier weiterhilft , hier mal unter verwendung von interface und abstrakter klasse :

Java:
public class Test{

	interface Robot {
		void action();
	}
	
	abstract class DefaultRobot implements Robot {}
	
	class JumpRobot extends DefaultRobot{

		@Override
		public void action(){
			System.out.println("ich springe");
		}
	}
	
	class DrillRobot extends DefaultRobot{
		
		@Override
		public void action(){
			System.out.println("ich bohre");
		}
	}
	
	public static void main(String[] args){
		Robot r = new Test().new DrillRobot();
		
		Robot x = new Test().new JumpRobot();
		
		r.action();
		
		x.action();
	}
}

du könntest hier auch der action methode einfach eine variable mitgeben , die dann jeweils entweder die tiefe beim bohren oder die höhe beim springen angibt.

{EDIT : ihr wart schneller als ich ^^}

Nur wie soll eine Klasse x zur Klasse y werden?

Garnicht , aber wie gucky schon erwähnt hat kannst du per instanceof prüfen von welcher Spezialisierung die instanz ist ,und dann dementsprechend Downcasten und dann die jeweilige methode aufrufen

oder du verwendest halt einfach das command pattern / eine abhandlung davon , dann gibt es wie in meinem Beispiel z.B einfach nur eine action methode
 
Zuletzt bearbeitet:

skuki

Aktives Mitglied
Bitte tausche jetzt den DrillRobo in einen JumpRobo damit ich das verstehe :)


Garnicht , aber wie gucky schon erwähnt hat kannst du per instanceof prüfen von welcher Spezialisierung die instanz ist ,und dann dementsprechend Downcasten und dann die jeweilige methode aufrufen

Bei downcasten steige ich leider aus :(

EDIT:
Commant Pattern seh ich mir gleich an, das war am Anfang noch nicht da ^^
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Muss es unbedingt so sein?
Wenn es unbedingt so sein muss, kannst du auch ein Interface/eine abstrake Klasse DrivingRobotAufsatz und DrillingRobotAufsatz erstellen.

Warum speicherst du die Aufsätze in einer Liste?
 

kaoZ

Top Contributor
Also nach dem Adapter-Pattern kannst/könntest du das ganze auch so machen :

Robot.java
Java:
public class Robot{

	private Adapter adapter;
	
	public Robot(Adapter a){
		adapter = a;
	}
	
	public void doWork(){
		adapter.doWork();
	}
	
	public void changeAdapter(Adapter a){
		adapter = a;
	}
}

Das Interface Adapter:
Java:
public interface Adapter{

	void doWork();
}

Eine konkrete implementierung könnte dann so aussehen :
Java:
public class DrillAdapter implements Adapter{

	@Override
	public void doWork(){
		System.out.println("jetzt bohre ich!");
	}
}

oder auch so:
Java:
public class JumpAdapter implements Adapter{

	@Override
	public void doWork(){
		System.out.println("Jetzt springe ich !");
	}
}

und das ganze ließe sich dann so benutzen :
Java:
public class Test{
	
	public static void main(String[] args){
		Robot r = new Robot(new JumpAdapter());
		
		r.doWork();
		
		r.changeAdapter(new DrillAdapter());
		
		r.doWork();
	}
}

ausgabe wäre dann logischerweise :

Code:
Jetzt springe ich !
jetzt bohre ich!


Zum Thema Downcast, du musst wenn du z.B in einer Methode einen Supertyp übergibst und oder eben erwartest, und dann mehrere Funktion und oder zwischen spezialisierungen unterscheiden möchtest, prüfen welche Spezialisierung übergeben wurde, dies kannst du dann per
Code:
instanceof
und oder in eingigen fällen per
Code:
.getClass();
machen , und dann das Interface auf eben eine dieser spezialisierungen casten, damit dir die jeweiligen methoden zur verfügung stehen insofern nicht in der Superklasse / dem Interface vorhanden.

Hier müsste dann ein Cast auf die konkrete implementierung stattfinden damit z.B eine methode ausgeführt werden kann die nur in der klasse HalloWelt existiert, und die der Superklasse oder dem Interface nicht bekannt ist.

Setzt vorraus das HalloWelt das Interface MeinInterface implementiert :
Java:
public void work(MeinInterface i){
  if(i instanceof HalloWelt){
     HalloWelt w = (HalloWelt) i;

     w.sayHello();
  }
}
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Letzten endes gibt es unzählige wege dein konkretes Problem zu lösen, ob mit dekorator, command oder Adapter pattern , oder mit einer eigenen Intuitiven lösung bleibt dann ganz dir überlassen. ;)

Eine art Dekorator könnte z.B so aussehen :

Java:
public class JumpRobot{

	private Robot robot;
	
	public JumpRobot(Robot r){
		robot = r;
	}
	
	void jump(int height){
		System.out.println("wuhu !");
	}
}

hier wird einfach ein Robot entgegen genommen und um die Funktionalität des springens erweitert.

Java:
public class Test{
	
	public static void main(String[] args){
		Robot r = new Robot(new JumpAdapter());
		
		r.doWork();
		
		r.changeAdapter(new DrillAdapter());
		
		r.doWork();
		
//		Robot konstruktor ohne adapter !
		JumpRobot j = new JumpRobot(new Robot()); 
		j.jump(20);
	}
}
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Zumindest einen Teil der gängigsten , alle kann man glaube ich nicht kennen xD

Ich habe mich da mal durch Design pattern - von Kopf bis Fuß gelesen, da konnte ich ein bisschen was von behalten ^^
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
jgh (Benutzer) Rollen in Java Java Basics - Anfänger-Themen 3
U Umsetzungsfrage: Personen mit mehreren "Rollen" Java Basics - Anfänger-Themen 9
JavaBeginner22 Button Text verändern Java Basics - Anfänger-Themen 1
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
H OOP Werte mit Set verändern Java Basics - Anfänger-Themen 6
M Was muss ich verändern damit ich es so ausgegeben bekomme wie auf dem Foto? Java Basics - Anfänger-Themen 2
A Haben KNNs ein Gedächtnis, lernen etwas oder verändern sich, während sie nicht trainieren, aber aktiv sind? Java Basics - Anfänger-Themen 3
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
A Variablen zum final verändern Java Basics - Anfänger-Themen 4
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
S Verändern der Liniendicke Java Basics - Anfänger-Themen 5
V Vererbung Subklasse soll Superklasse verändern Java Basics - Anfänger-Themen 2
S werte von objekten in schleife verändern Java Basics - Anfänger-Themen 14
N Sicherheitsnummer erstellen und verändern können Java Basics - Anfänger-Themen 1
C Rekursiven Programmcode verändern Java Basics - Anfänger-Themen 11
A JLabel mit button drücken verändern Java Basics - Anfänger-Themen 6
J Wert bei Objekterzeugung verändern Java Basics - Anfänger-Themen 12
J Die Y Koordinate von einer anderen Klasse auch verändern Java Basics - Anfänger-Themen 1
L JTable Tagebuch Spaltenhöhe verändern Java Basics - Anfänger-Themen 3
M Listener für Button - Wert von Variablen verändern Java Basics - Anfänger-Themen 14
D Mit Buttonklick Farbe der anderen Buttons verändern? Java Basics - Anfänger-Themen 2
G Im ActionListener eine "äußere" Variable verändern Java Basics - Anfänger-Themen 13
E RTF/DOC(x) textteile ersetzen/verändern Java Basics - Anfänger-Themen 0
W aus Methode auf JLabel zugreifen und Image verändern Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
I For Schleife - Variable verändern Java Basics - Anfänger-Themen 4
C Im Array zählen und verändern Java Basics - Anfänger-Themen 5
C Finden und verändern Java Basics - Anfänger-Themen 1
J Erste Schritte String verändern Java Basics - Anfänger-Themen 3
M Von einer Klasse aus, Objekte einer anderen Klasse verändern. Java Basics - Anfänger-Themen 2
Streeber Jar dekompilieren, Code verändern und als .jar speichern Java Basics - Anfänger-Themen 5
K Windows Kontextmenü verändern Java Basics - Anfänger-Themen 5
M Zahlen verändern nach Zeit Java Basics - Anfänger-Themen 6
TheSorm Obercalsse von Unterclasse verändern Java Basics - Anfänger-Themen 3
C Input/Output Hilfe..txt Datei zeile verändern und Ausgabe ..Hilfe Java Basics - Anfänger-Themen 11
L Platz auf JButtons verändern Java Basics - Anfänger-Themen 18
O Bereits "gepostete" Strings in der Konsole verändern? Java Basics - Anfänger-Themen 2
G über JButton Action einen anderen Button verändern Java Basics - Anfänger-Themen 7
J Android R.Java verändern!? Java Basics - Anfänger-Themen 6
M Felder mit Methode verändern Java Basics - Anfänger-Themen 11
I Shortcut verändern Java Basics - Anfänger-Themen 9
P GUI - Layout per Laufzeit erstellen/verändern? Java Basics - Anfänger-Themen 6
S String verändern Java Basics - Anfänger-Themen 15
I Im JFrame Inhalte verändern per Methode aus anderer Class Java Basics - Anfänger-Themen 5
K In ArrayList Daten verändern Java Basics - Anfänger-Themen 8
M Klassen Durch den ActionListener das GUI einer anderen Klasse verändern Java Basics - Anfänger-Themen 8
J Collections Auf ein bestimmtes Objekt in der Liste zugreifen und Werte verändern + Anschließend Sortieren... Java Basics - Anfänger-Themen 8
F Klassenübergreifend String verändern Java Basics - Anfänger-Themen 5
R Benutzeroberfläche verändern Java Basics - Anfänger-Themen 4
H BufferedImage DPI verändern Java Basics - Anfänger-Themen 5
J Mit JS, Text und Bilder von Webseite verändern... Java Basics - Anfänger-Themen 10
X Collections Reihenfolge bestimmter Objekte in einer ArrayList verändern Java Basics - Anfänger-Themen 2
B ComboBox(editable) - Text verändern Java Basics - Anfänger-Themen 7
S String dauerhaft mit replaceAll verändern Java Basics - Anfänger-Themen 3
V "TAB" komplett verändern Java Basics - Anfänger-Themen 10
Z Anzahl der Stellen nach dem Komma verändern. Java Basics - Anfänger-Themen 7
C ComboBoxModel mit Daten der Datenbank verändern Java Basics - Anfänger-Themen 2
C jPanel im jPanel verändern Java Basics - Anfänger-Themen 15
B JPanel nachträglich verändern Java Basics - Anfänger-Themen 20
StrikeTom *.txt-datei verändern|wie? Java Basics - Anfänger-Themen 5
S Eigenes Objekt temporär verändern? (Clone)? Java Basics - Anfänger-Themen 12
E Breite des Schiebers in JscrollPane verändern Java Basics - Anfänger-Themen 2
J Ausgelesenen Dateipfad verändern Java Basics - Anfänger-Themen 5
B Ausgabe verändern Java Basics - Anfänger-Themen 6
L Methode über for-schleife aufrufen und verändern Java Basics - Anfänger-Themen 7
L Methode über for-schleife aufrufen und verändern Java Basics - Anfänger-Themen 5
R Textdatei im Internet verändern... Java Basics - Anfänger-Themen 4
B Hintergrundfarbe laufend verändern Java Basics - Anfänger-Themen 14
B Collection während Iteration verändern Java Basics - Anfänger-Themen 7
D .class-Datei innerhalb einer .jar-Datei verändern Java Basics - Anfänger-Themen 4
F Verändern einer Variable im ActionListener Java Basics - Anfänger-Themen 14
A Von einer Klasse aus die Eingabe einer anderen verändern Java Basics - Anfänger-Themen 3
D kleine Passwortabfrage erstellen incl. Method zum verändern Java Basics - Anfänger-Themen 7
G Variable welche in anderer Klasse liegt, verändern. Java Basics - Anfänger-Themen 2
M Text in Konsole schreiben, den man irgendwie verändern kann. Java Basics - Anfänger-Themen 9
G JLabel nachträglich verändern, bzw. ImageIcon ändern? Java Basics - Anfänger-Themen 3
C Bild in JTable verändern (nach einem Klick auf Zelle) Java Basics - Anfänger-Themen 4
P Array in einer Methode verändern Java Basics - Anfänger-Themen 6
M JTable grösse verändern Java Basics - Anfänger-Themen 6
F [Map] Eintrag gezielt verändern Java Basics - Anfänger-Themen 3
T GridLayout % Verändern? Java Basics - Anfänger-Themen 3
B Button Text auf Knopfdruck verändern Java Basics - Anfänger-Themen 3
G Font Color von JLabel verändern Java Basics - Anfänger-Themen 1
G jProgressBar value aus anderer Klasse heraus verändern Java Basics - Anfänger-Themen 7
G Einzelne Datei im jar verändern ? Java Basics - Anfänger-Themen 5
G Mauszeiger verändern? Java Basics - Anfänger-Themen 1
F Grösse JTextField verändern Java Basics - Anfänger-Themen 2
G Anzahl Textfelder zur Laufzeit verändern. Java Basics - Anfänger-Themen 4
G String verändern Java Basics - Anfänger-Themen 4
G Länge eines Array trimmen oder dynamisch verändern. Java Basics - Anfänger-Themen 3
M String in Liste von Objekten suchen und verändern? Java Basics - Anfänger-Themen 8
S Boolean während while-schleife verändern? Java Basics - Anfänger-Themen 6
S Cursor Form und oder Farbe verändern, geht das???? Java Basics - Anfänger-Themen 4
J Kann man Daten innerhalb einer Datenstruktur verändern? Java Basics - Anfänger-Themen 4
S .txt-Datei einlesen und verändern Java Basics - Anfänger-Themen 18
G applet verändern Java Basics - Anfänger-Themen 8
C Klassenattribut über Konstruktor verändern Java Basics - Anfänger-Themen 6
G Problem bei Dateikopieren + leicht verändern Java Basics - Anfänger-Themen 7
T Button:Größe verändern Java Basics - Anfänger-Themen 8
T Arrays teilweise verändern Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben