Avatar billede orca Nybegynder
02. september 2003 - 19:12 Der er 6 kommentarer og
2 løsninger

Reference imellem klasser

Hejsa.

Jeg har en klasse "1". Denne klasse indeholder en variabel som referer til en anden klasse "2". Hver klasse "2" indeholder også en arraylist med eventuelle children, disse er også af typen "2". Hver klasse "2" skal referere til klassen "1" som de allesammen er en slags children af.

Hvordan gøres det mest effektivt? Jeg har forsøgt mig med at lave en variabel af typen "1" som jeg satte ligmed min instans af "1", men det virker ikke, så får jeg en "object reference not set to an instance of an object" fejl.

Nogen råd?
Avatar billede arne_v Ekspert
02. september 2003 - 19:21 #1
Når "1" opretter "2" skal den vel sende en referance til sig selv med
over i constructor.
Avatar billede arne_v Ekspert
02. september 2003 - 19:27 #2
Her er et lille fjollet do nothing eksempel:

using System;

class C1
{
    private C2 c;
    public C1()
    {
        c = new C2(this);
    }
    public override string ToString()
    {
        return "P" + c;
    }
    public static void Main(string[] args)
    {
        C1 p = new C1();
        Console.WriteLine(p);
    }
}

class C2
{
    private C1 p;
    public C2(C1 p)
    {
        this.p = p;
    }
    public override string ToString()
    {
        return "C";
    }
}
Avatar billede orca Nybegynder
02. september 2003 - 20:03 #3
Jeg kan stadig ikke få det til at virke. Jeg har lige prøvet at lave et lille hurtigt eksempel på hvordan det virker:

class C1
{
  private C2 root;

  public C2 Root
  {
    set
    {
      root = value;
      root.parentClass = this;
    }
  }
}

class C2
{
  private ArrayList children = new ArrayList();
  private parentClass

  public void AddChild(C2 childToAdd)
  {
    childToAdd.parentClass = parentClass
    children.Add(childToAdd)
  }
}

Koden jeg bruger er således:

C1 myC1 = new C1();
C2 myC2 = new C2();

C2.AddChild(new C2();)

C1.Root = C2;

Jeg har ikke lige testet det, men jeg tror jeg fik det med :)

Problemerne opstår når jeg fra enten min "Root" C2 eller fra dennes children vil prøve at tilgå min parentClass variabel, så får jeg fejlen. Jeg kan ikke umiddelbart gennemskue hvorfor.
Avatar billede orca Nybegynder
02. september 2003 - 20:04 #4
Og bare ignorer de forkert sat, og manglende, semikoloner :)
Avatar billede kichian Nybegynder
02. september 2003 - 20:18 #5
Da parentClass er privat for C2, så fejler root.parentClass = this; i C1 under alle omstændigheder.

Derudover gør rækkefølgen en forskel:
C1 myC1 = new C1();
C2 myC2 = new C2();
C2.AddChild(new C2()); // Den nye får ikke reference til næste C1
C1.Root = C2;

Derfor skal lave en property på C2, fx ParentClass, som sætter parentClass for alle C2 som ligger i children.
Avatar billede orca Nybegynder
02. september 2003 - 20:39 #6
Jeg kan godt se fejlen mht. root. Men jeg forstår ikke din bemærkning:

C2.AddChild(new C2()); // Den nye får ikke reference til næste C1

Hvorfor får den ikke reference til C1? Den gør det naturligvis ikke fordi root fejler, og da vil den også fejle i alle de næste, men jeg tror ikke det er det du kommenterer. AddChild metoden sætter jo den nyes parenClass til at være ligmed dens egen parentClass, således bør den også referere til C1. Eller?
Avatar billede orca Nybegynder
02. september 2003 - 21:03 #7
Min fejl, jeg er bare lidt tykpandet :)

Jeg fik det løst, jeg deler point imellem jer, tak til jer begge!
Avatar billede arne_v Ekspert
02. september 2003 - 21:10 #8
OK.

Jeg var lige igang med noget kode.

I får den alligevel.

using System;
using System.Collections;

class MainClass
{
    public static void Main(string[] args)
    {
        Parent p = new Parent();
        p.addChild(new Child());
    }
}

class Parent
{
    private ArrayList cs;
    public Parent()
    {
        cs = new ArrayList();
    }
    public void addChild(Child c)
    {
        cs.Add(c);
        c.P = this;
    }
}

class Child
{
    private Parent p;
    public Child()
    {
        p = null;
    }
    public Parent P
    {
        set
        {
            p = value;
        }
        get
        {
            return p;
        }
    }
}
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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