02. september 2003 - 19:12Der 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.
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"; } }
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.
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.
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?
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; } } }
Synes godt om
Ny brugerNybegynder
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.