Supportnet / Forum / Anwendungen(Java,C++...)
[Java] Zugriff auf Instanznutzendes Oberobjekt
Frage
Hallo Leute,
das Problem ist verbal schlecht zu beschreiben...
Objekt A bildet eine Instanz von Objekt B
Wie kann nun zur Laufzeit von Objekt B auf eine Methode von Objekt A zugegriffen werden?
"super.methode" wäre ja der Zugriff auf eine vererbte Klasse, was es ja aber in diesem Fall nicht ist.
Hat einer von euch eine Lösung?
Danke :)
[*][quote][sup][i]*Nick editiert*
Admininfo: siehe die SN [url=https://supportnet.de/sn_about_usage.html][u]Nutzungsbedingungen.[/u][/url][/i][/sup][/quote]
Antwort 1 von disco
moin
indem du einen verweis des objekts a dem konstrukter von objekt b mitgibst.
schnell und ohne richtige syntax (gleich ist fussball):
class a
{
ObjektB b = new ObjektB(this)
}
class b
{
Konstruktor(ObjectA a)
{
int zahl = a.eineMethodeAusA();
}
}
g,
disco
indem du einen verweis des objekts a dem konstrukter von objekt b mitgibst.
schnell und ohne richtige syntax (gleich ist fussball):
class a
{
ObjektB b = new ObjektB(this)
}
class b
{
Konstruktor(ObjectA a)
{
int zahl = a.eineMethodeAusA();
}
}
g,
disco
Antwort 2 von Dr.M.
@disco
Vielen Dank für den Hinweis. Ablauftechnisch habe ich es vollkommen verstanden, aber...
besteht dabei nicht ein gewisses Risiko hinsichtlich Rekursivität? Könntest Du diesbezüglich mal eine textuelle Erklärung und/oder den technischen Beweis in Form von Sourcecode liefern, der darlegt, daß es keine Probleme mit der Rekursivität gibt.
Danke im voraus.
Vielen Dank für den Hinweis. Ablauftechnisch habe ich es vollkommen verstanden, aber...
besteht dabei nicht ein gewisses Risiko hinsichtlich Rekursivität? Könntest Du diesbezüglich mal eine textuelle Erklärung und/oder den technischen Beweis in Form von Sourcecode liefern, der darlegt, daß es keine Probleme mit der Rekursivität gibt.
Danke im voraus.
Antwort 3 von Dr.M.
Kleiner Nachtrag...
und wie geht das ganze wenn ich den Constructor von B nicht verändern kann bzw. der Auftruf eiskalt mit newObjectB() erfolgt?
Konkret: gemäß obigem Bsp. ist ObjectA = JTable und ObjectB = eine Vererbung von AbstractTableModel
Ich möchte also aus der Modelklasse auf die GUI-Klasse zugreifen...
Das model wird über .setModel(B) - Methode zugeordnet
:)
und wie geht das ganze wenn ich den Constructor von B nicht verändern kann bzw. der Auftruf eiskalt mit newObjectB() erfolgt?
Konkret: gemäß obigem Bsp. ist ObjectA = JTable und ObjectB = eine Vererbung von AbstractTableModel
Ich möchte also aus der Modelklasse auf die GUI-Klasse zugreifen...
Das model wird über .setModel(B) - Methode zugeordnet
:)
Antwort 4 von Rangoo
/** class A */
public class A{
/** method printing on standard output stream.*/
public void method(){
System.out.println("Hello World!");
}
/** method creating a new instance of B, calls method() in B. */
public void methodWithB(){
(new B(this)).method();
}
/** method creating a new instance of B, calls methodToCrash() in B. Will cause crash. */
public void methodToCrash(){
(new B(this)).methodToCrash();
}
/** Main class. Will prompt "Hello World" and informing about occured Error. */
public static void main(String[] args){
A a = new A();
a.methodWithB();
try{
a.methodToCrash();
}
catch(Error e){
System.out.println("This was StackOverflowError.");
}
}
}
/** class B */
class B{
// parental instance
private A parent;
/** constructor setting parental instance A. */
public B(A a){
if (a==null) throw new IllegalArgumentException("D´oh!");
parent = a;
}
/** method calling method() of parental instance. */
public void method(){
parent.method();
}
/** method calling methodToCrash() of parental instance causing StackOverflow. */
public void methodToCrash(){
parent.methodToCrash();
}
}
Man kann eigentlich immer irgendwelche Rekursionen einbauen, wenn man will...
Antwort 5 von disco
Zitat:
besteht dabei nicht ein gewisses Risiko hinsichtlich Rekursivität?
besteht dabei nicht ein gewisses Risiko hinsichtlich Rekursivität?
na das kommt ja auf deinen quelltext an. da biste allein für verantwortlich. darfst halt einfach keine instanz von A aus B erzeugen...
Zitat:
und wie geht das ganze wenn ich den Constructor von B nicht verändern kann
und wie geht das ganze wenn ich den Constructor von B nicht verändern kann
wen du den konstruktor nicht verändern kannst, wie möchtest du dann überhaupt einen zugriff von B auf A realisieren?
auch wenn ich den zusammenhang mit den unveränderbaren konstruktor nicht verstehe:
wenn du die klasse nicht verändern kannst, kannste ja einfach eine eigene machen und diese von ihr ableiten (extends).
public class KindVonB extends B
{
public B(A a)
{
super();
}
}
Antwort 6 von disco
oh falsch
public class KindVonB extends B
{
public KindVonB(A a)
{
super();
}
}
public class KindVonB extends B
{
public KindVonB(A a)
{
super();
}
}