Supportnet Computer
Planet of Tech

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

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.

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

:)

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?

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

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();
}
}

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: