Auf Parent-Attribut zugreifen



  • Guten Tag,

    ich weiß garnicht genau wie ich die Frage stellen soll.
    Im (Pseudo-)Quelltext unten erstelle ich zwei Instanzen der selben Klasse.
    Dabei weiße ich der parent-instanz eine child-instanz als Attribut zu.
    Kann ich jetzt irgendwie von child auf das 'int Level' von Parent kommen,
    sodass getParentLevel() eine 9 zurückwirft und keine 0.
    Dabei möchte ich dem Child nicht erst den Parent übergeben.
    Irgendwie muss er doch da drauf zugreifen können.

    Hoffentlich versteht jemand die Frage 😃

    class foobar
        {
            public foobar child;
            public int Level = 0;
    
            public foobar Child
            {
                get { return this.child; }
                set { this.child = value; }
            }
    
            public int getParentLevel() {
                // Diese Methode wird vom Child aufgerufen und soll das _Level des eigentlichen Parents_ haben.
                // Dabei möchte ich diesen nicht übergeben.
                // Gibt es da ne Möglichkeit? Gemeint ist sowas wie base, jedoch wurde hier ja nichts vererbt.
               return Level;
            }
        }
    
        foobar parent = new foobar();
        parent.Level = 9;
    
        foobar child = new foobar();
        parent.Child = child; // hier ist die einzige Referenz
        child.getParentLevel();
    


  • Nein das geht nicht.

    Was spricht gegen ein weiteres Property: public foobar Parent {get;set} ?

    Oder so (unvollständig! Beim erneuten setzen des Child muss die alte Verbindung gelöst werden):

    private foobar parent;
    
    public foobar Child
    {
    	get { return this.child; }
    	set 
    	{ 
    		this.child = value; 
    		value.parent = this;
    	}
    }
    
    public int getParentLevel() 
    {
    return parent.Level;
    }
    


  • Oder so (unvollständig! Beim erneuten setzen des Child muss die alte Verbindung gelöst werden):

    private foobar parent;
    
    public foobar Child
    {
        get { return this.child; }
        set
        {
            this.child = value;
            value.parent = this;
        }
    }
    
    public int getParentLevel()
    {
    return parent.Level;
    }
    

    Klasse! Genau das habe ich gesucht.
    Jedoch merke ich gerade, dass mein Problem eigentlich ein ganz anderes ist.
    Mühsam versuche ich mir hier eine Klasse zusammenzustellen, welche wie ein QuadTree arbeitet.
    Ich habe keine Ahnung wie ich das am besten mache - ich bin mittlerweile bei der 3ten Implementierung.

    Hier ist mal die Klasse:

    public class Node
        {
            public Node parent;
            public Node[] child = new Node[4];
            public readonly int val = -1;
            public int Level;
    
            public Node(int val = -1) // bei -1 ist es kein Blatt
            {
                this.val = val;
            }
    
            public Node NO // 1. Quadrant
            {
                get { return this.child[0]; }
                set { this.child[0] = value; value.parent = this; }
            }
    
            public Node NW // 2. Quadrant
            {
                get { return this.child[1]; }
                set { this.child[1] = value; value.parent = this; }
            }
    
            public Node SW // 3. Quadrant
            {
                get { return this.child[2]; }
                set { this.child[2] = value; value.parent = this; }
            }
    
            public Node SO // 4. Quadrant
            {
                get { return this.child[3]; }
                set { this.child[3] = value; value.parent = this; }
            }
    
    }
    

    Und hier die Initialisierung.

    Node n1 = new Node();
                n1.NO = new Node(1);
                n1.NW = new Node(1);
                n1.SW = new Node(1);
                n1.SO = new Node(1);
    

    Bevor ich zu meinem Problem komme:
    Habe ich das bislang überhaupt richtig gemacht?



  • Hallo

    Du solltest, wie gesagt, die alte Verbindung lösen, bei erneutem Aufruf des Set-Accessors (Bezogen auf das erste Beispiel von Dir)

    if(child!=null)
      child.parent = null;
    child = value;
    if(child!=null)
      child.parent = this;
    

    Weiter: Welchen Zweck erfüllt val?

    public Node(int val = -1) // bei -1 ist es kein Blatt
    

    Es ist nicht notwendig in val zu kodieren, ob der Knoten ein Blatt ist. Ein Blatt hat keine Kinder, für ein Blatt sind also alle Elemente im child-Array == null.

    Ansonsten beschreibe Dein Problem einfach mal. Dann kann man am einfachsten sagen, ob Du auf dem richtigen Weg bist.

    Gruß, µ



  • Für einen Quadtree ist es auch ganz schön, wenn er sich selbst unterteilen kann.

    Ich vermute mal Du hast eine List von Geometriedaten pro Knoten. Falls die Liste zu viele Daten enthält, wird eine Methode "Subdivide" aufgerufen. Diese erstellt die 4 Kindknoten, verteilt die Geometrie auf die jeweiligen Kinder und führt das rekursiv weiter bis zu einer bestimmten Maximaltiefe.


Anmelden zum Antworten