Problem mit Klassen Handling
-
Hallo zusammen,
ich hoffe, dass Ihr dem Java Anfänger helfen könnt.
Angenommen, ich habe drei Klassen, die Daten untereinander Daten austauschen sollen.
Die Einstiegsklasse Class1 erstellt zwei Objekte:Class2 class2 = new Class2(); Class3 class3 = new Class3();
Jetz möchte ich aber Methode von class3 in class2 aufrufen.
In c++ hätte ich mir den Zeiger auf class3 besorgt und so den Zugriff auf die Methoden bekommen.
Geht das auch in Java?Mein konkreter Fall:
GUI Klasse erstellt eine TaskTimer Klasse, von der ich in Intervalen die Methoden verschieden Klassen aufrufen möchte (Socket- Daten Empfang, Berechnungen etc.) Die alle sollten an die GUI Klasse Ergebnisse liefern und zusätzlich einen 3D Modell steuern (eigene Klasse).
Also jede Menge Datenaustausch.
Wie mache ich das?
Alle Bücher, die ich habe, behandeln Probleme, die sich auf maximal zwei Klassen beschränken.
Für einem Buch oder Tutorial Tipp, wäre ich auch dankbarGrüße
Roman
-
Class2 class2; Class3 class3; ... class2 = new Class2(class3);
nu kannste class3 als Attribut in der Klasse Class2 halten und die Methoden benutzen. Sowas?
-
Hi,
Wenn von einer Klasse aus die Methoden mehrer anderer aufgerufen werden könntest du die Klassen in einem Vector halten und dann einfach alle aufrufen. Dann solltest du die Zugriffe allerdings über ein Interface normieren.
Aber ich glaube aus deiner Frage rauszulesen das Du das Objekt als Referenz übergeben willst und nicht als Kopie. In Java werden Objekte allerdings generell als Referenz übergeben.
public class class1 implements TimerTask { private Vector somestuff = new Vector(); . . . public void run() { for( int i = 0; i < this.somestuff.length(); i++ ) { ((DeinInterface)this.somestuff.elementAt( i ) ).deineMethode(); } } public void add( Object object ) { this.somestuff.add( object ); } public void remove( Object object ) { this.somestuff.remove( object ); } }
Gruß,
ich
-
Danke an auch beiden.
Übergabe der Referenz ist also der Schlüssel.
Hab schon mal ausprobiert, klappt prima. Allerdings habe ich noch Problem, ich möchte die Ergebnisse aus class2 an class1 übertragen dh.
class1 erstellt Instanz class2. class2 berechnet bzw. bekommt die Daten von aussen Jetzt sollten diese Daten in class1 übetragen werden (sprich public Variablen aktualisieren) die dann in GUI angezeigt werden.
Da habe ich aber keine Referenz der aufrufenden Klasse.
Habe es so versucht :/* class1 */ public class Class1 extends Applet { int i; public Class1(){ Timer timer = new Timer(); timer.schedule(new Class2(this),2000,10000); } } /****************************************/ /* Class2 */ public class Class2 extends TimerTask { int a = 0; Class1 gui; public Class2(Class1 refIn){ gui = refIn; } public void run() { gui.index = a; a++; } }
die Variable i wird korrekt hoch gezählt. Mein Frage aber, ist so ein Aufbau ok, oder für einem Profi gruselig schlecht?
Was mir immer noch fehlt, ist der Umgang mit dem Zusammenspiel zwischen Klassen in einem größerem Projekt. Gibts dafür keine Literatur?Grüße
Roman
-
Also bei den 3 Zeilen Code welche Class2 überhaupt hat: ich hätte das wohl mit einer anonymen Klasse gelöst (und mir den Aufwand einer zusätzlichen Datei gespart). Aber deine Variante ist ebenfalls eine passende Antwort auf das Problem.
Lediglich die Zeile "gui.index = a;" ist zu diskutieren: index sollte IMHO privat sein, und Class2 sollte eine Methode wie "setIndex( a );" aufrufen.Bei grossen Programmen läuft es ähnlich: Referenzen werden an die richtige Stelle gesetzt und benutzt. Hier werden dann aber vermehrt Interfaces benutzt, so wird ein grosses Programm praktisch in mehrere kleine unterteilt, welche einander garnicht kennen (bzw. nur sehr wenig miteinander kommunizieren).
Es gibt einige Muster wie und wann wo welche Methoden von welcher Referenz aufgerufen werden sollten, sogenannte "Design Patterns". Google wird hier sicherlich tonnenweise Material ausspucken...
Nur eines ist wichtig dabei: diese Patterns sind nicht in Stein gemeisselt, du kannst sie jederzeit für dein Programm anpassen, verändern, verschmelzen, verstümmeln, etc.