PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java -- this und innere Klassen


Gast
2009-01-23, 11:37:04
Huhu!

In einem anonymen ActionListener-Zweizeiler

button.addActionListener( new ActionListener { ... actionPerformed ...XYZ ... } );

möchte ich die äussere Klasse übergeben.

Wenn ich bei XYZ "new meineKlasse(this);" schreibe, dann bezieht sich das 'this' aber auf die innere Klasse, also den ActionListener.

Wie komme ich an die umgebende Klasse heran?


Bisher habe ich mir mit
final private aeussereKlasse = this;
geholfen, sodass
new meineKlasse(aeussereKlasse);
funktioniert, wie ich es beabsichtige.

Das geht sicher geschickter, oder?

Monger
2009-01-23, 12:59:14
Ach Gott, wie ging denn das nochmal...

Ich glaub, du kannst in einer inneren Klasse die äußere Klasse ansprechen, indem du explizit den Namen schreibst und dann "this".

Also ungefähr so:

public class ÄußereKlasse{

public void bla(){}
public class InnereKlasse{

public void doSth(){
ÄußereKlasse.this().bla();
}
}

}

Oder so ähnlich.

instinct
2009-01-23, 17:55:22
Geht auch einfacher
Ach Gott, wie ging denn das nochmal...

Ich glaub, du kannst in einer inneren Klasse die äußere Klasse ansprechen, indem du explizit den Namen schreibst und dann "this".

Also ungefähr so:

public class ÄußereKlasse{

public void bla(){}
public class InnereKlasse{

public void doSth(){
bla();
}
}

}

Oder so ähnlich.

Monger
2009-01-23, 18:06:45
Geht auch einfacher
Hm, sicher?
Auf jeden Fall brauchst du einen passenden Identifizierer, wenn es sowohl in der inneren wie auch der äußeren Klasse das selbe Attribut bzw. die selbe Methode gibt. Da müsste das dann so ungefähr aussehen wie ich beschrieben habe.

instinct
2009-01-23, 18:08:40
Ja das geht auf jeden Fall, es sei denn du implementierst in der Unterklasse eine Methode der selben Signatur, dann musst du über Klassenname.this. gehen, so wie du es beschrieben hast.

Senior Sanchez
2009-01-23, 18:51:11
Ach Gott, wie ging denn das nochmal...

Ich glaub, du kannst in einer inneren Klasse die äußere Klasse ansprechen, indem du explizit den Namen schreibst und dann "this".

Also ungefähr so:

public class ÄußereKlasse{

public void bla(){}
public class InnereKlasse{

public void doSth(){
ÄußereKlasse.this().bla();
}
}

}

Oder so ähnlich.

Fast ;)


public class ÄußereKlasse{

public void bla(){}
public class InnereKlasse{

public void doSth(){
ÄußereKlasse.this.bla();
}
}

}

Tiamat
2009-01-23, 21:52:12
Oja des geht sogar viel komfortabler.
Man benutzt Swing-Komponenten und muss der Komponente nur noch den jeweiligen ActionListener übergeben.

Sagen wir mal eine Klasse ButtonController, die einen ActionListener implementiert, wird in deiner Gui Klasse instanziert, Bezeichner z.b controller
Dann brauchst du nur noch

component.addActionListener(buttoncontroller); einzutippen.

Ganon
2009-01-23, 22:19:19
Man kann auch das Swing Application Framework nutzen ;) Da ist es noch einfacher :D

Tiamat
2009-01-24, 11:19:26
Wenn man auf Code-Redundanz pfeift und keine speziellen Wünsche hat, kann man das ruhig tun ;D

Gast
2009-01-27, 13:05:28
Oja des geht sogar viel komfortabler.
Man benutzt Swing-Komponenten und muss der Komponente nur noch den jeweiligen ActionListener übergeben.

Sagen wir mal eine Klasse ButtonController, die einen ActionListener implementiert, wird in deiner Gui Klasse instanziert, Bezeichner z.b controller
Dann brauchst du nur noch

component.addActionListener(buttoncontroller); einzutippen.Ja, so soll das aber nicht passieren, weil man dann eine extra Klasse hat, die man aber eigentlich gar nicht namentlich bzw mit Referenz darauf braucht.
Die anonyme Klasse soll beibehalten werden und unter Berücksichtigung dessen eine "elegante" Lösung gefunden werden.

Das mit dem "blah" konnte ich leider noch nicht ausprobieren, aber ich denke, dass das so klappen wird. Ihr wisst schon, was ihr tut, im Gegensatz zu mir. ;D

Ganon
2009-01-27, 13:25:32
Wenn man auf Code-Redundanz pfeift und keine speziellen Wünsche hat, kann man das ruhig tun ;D

Ich würde eher sagen, je nach Projektgröße ;)

Eine kleine Anwendung zum Datein eingeben, muss nicht bis ins letzte Ende nach OO Richtlinien durchgestaltet sein.

Sonst hast du nachher 300 Zeilen Code, nur um die Oberfläche ein mal zu aktualisieren :ugly: