Avatar billede andersblarsen Nybegynder
24. juli 2003 - 16:53 Der er 14 kommentarer og
1 løsning

Dobbeltrettet relation

Hej!
Hvordan laver jeg en dobbeltrettet relation således at jeg fra class A kan referere til class B og omvendt.
Eller måske rettere
mellem et objekt af typen A og et objekt af typen B

Anders
Avatar billede tosssen Nybegynder
24. juli 2003 - 17:01 #1
Hvad med:

A a = new A();
B b = new B();
a.setRef(b);
b.setRef(a);

setRef kan implementeres således:

public void setRef(Object obj)
{
  ref = obj;
}

Hvor ref er en instansvariabel i den givne klasse
Avatar billede tosssen Nybegynder
24. juli 2003 - 17:02 #2
Jeg er ikke helt sikker på hvad du mener
Avatar billede arne_v Ekspert
24. juli 2003 - 17:58 #3
Sådan:

public class A {
  private B b;
  public A() {
  }
  ...
  public etellerandet() {
      ...
      b = new B(this);
      ...
  }
  ...
}

public class B {
    private A a;
    public B(A a) {
        this.a = a;
    }
    ...
}
Avatar billede magoo20000 Nybegynder
24. juli 2003 - 18:00 #4
Ja, det er som arne skriver lige ud af landevejen. Af nysgerrighed: Hvad skal det benyttes til?
Avatar billede arne_v Ekspert
24. juli 2003 - 18:01 #5
Eller måske endnu bedre:

public class A {
  private B b;
  public A() {
      b = new B(this);
  }
  ...
}

public class B {
    private A a;
    public B(A a) {
        this.a = a;
    }
    ...
}
Avatar billede arne_v Ekspert
24. juli 2003 - 18:02 #6
Det lyder jo meget som et UML diagram der skal omsættes til kode !
Avatar billede tosssen Nybegynder
24. juli 2003 - 18:11 #7
arne_v>> Er der nogen stor forskel på din og min løsning? Udover antallet af linjer man skal skrive i main-metoden?
Avatar billede arne_v Ekspert
24. juli 2003 - 18:20 #8
Ingen stor forskel.

Der er 2 små forskelle:

* du erklærede argumentet til Object hvilket er lidt generelt

* ved at putte det ind i constructor i.s.f. en set metode, så
  næsten tvinger man programmøren der skal bruge klassen til at
  have relationen i orden - man kan jo glemme at kalde en set metode

Men set er altså også en valid løsning.
Avatar billede tosssen Nybegynder
24. juli 2003 - 18:29 #9
Hvad med at lave et interface?

public interface Introduction
{
  public void introduce(Introduction intr, boolean bl)
}

En implementering af interfacet kunne se sådan ud:

public class A implements Introduction
{
  ...

  Introduction b;

  public void introduce(Introduction intr, boolean bl)
  {
      b = intr;
      if (bl==true)
        intr.introduce(this, false);
  }
}

public class B implements Introduction
{
  ...

  Introduction a;

  public void introduce(Introduction intr, boolean bl)
  {
      a = intr;
      if (bl==true)
        intr.introduce(this, false);
  }
}

public static void main(String[] args)
{
  A a = new A();
  B b = new B();
  a.introduce(b); // eller b.introduce(a);
  ...
}
Avatar billede tosssen Nybegynder
24. juli 2003 - 18:30 #10
ups der skal selvfølgelig stå a.introduce.(b,true); og omvendt
Avatar billede arne_v Ekspert
24. juli 2003 - 18:45 #11
Det kunne man godt.

Men jeg tror ikke at man vil.

Fordi det er ret besværligt at bruge den referance til noget.
Avatar billede tosssen Nybegynder
24. juli 2003 - 18:52 #12
Forestil dig et computer-spil. Når der skal laves collision detection, så skal hvert spilobjekt være introduceret til rigtig mange andre! Men selvfølgelig afhænger det af hvad man skal bruge sin reference til.
Avatar billede arne_v Ekspert
24. juli 2003 - 18:55 #13
Jo.

Men man står med en referance til en Introduction som kun har en metode
nemlig introduce. det er der ikke meget sjov ved.

Og:

if(a instanceof A) {
  A reala = (A)a;
  // gør noget med reala
}

er ikke køn kode !

Hvis interfacet har alle de metoder man skal bruge, så er det en anden sag.
Avatar billede tosssen Nybegynder
24. juli 2003 - 19:01 #14
ok - du vinder ;-)
Avatar billede andersblarsen Nybegynder
27. juli 2003 - 12:33 #15
Jeg siger tak for den heftige debat, med de mange gode råd m.v. :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester