Ich bräuchte ein Tree-Klasse mit folgenden Node:
ein Datanode für Integer. Dieser Node kann keine weitere Nodes mehr aufnehmen.
ein Datanode für Floats. Dieser Node kann keine weitere Nodes mehr aufnehmen.
Ein Groupnode. Dieser Node kann datennodes und andere groupnodes aufnehemen und wird über einen string angesprochen.
node* n = root.get( "texture" ).get( "data" );
Wie soll ich das realisieren?
Ich hätte das gerne Typensicher und ohne casts.
ImageTools for Silverlight: http://imagetools.codeplex.com | http://www.silverdiagram.net | http://www.cleancodedeveloper.de b:::
Eine Möglichkeit: (wahrscheinlich stark verbesserungswürdig 😉
public interface INode {
public string Name;
}
public class FloatNode : INode{
private string name;
private float val;
public FloatNode(string name, float value) {
this.name = name;
this.val = value;
}
public string Name { get { return name; } }
public float Value {
get { return value; }
set { val = value; }
}
}
// das gleiche nochmal für int
public class GroupNode : INode {
private ArrayList nodes;
private string name;
// Konstruktor
// getter für Name
public void Add(INode node)
{
nodes.Add(node);
}
//noch weitere Funktionen um z.B. nodes abzufragen, bzw. zu löschen
}
Ich hab hier eine ArrayList für den GroupNode verwendet. Aus dem einfachen Grund: normalerweise willst du den Baum geordnet aufbauen. So musst du allerdings in der get Methode durch alle nodes durch gehen und den Namen vergleichen. Mit nem Hashset wäre die Abfrage natürlich einfacher, da du dort einen Key hast, allerdings sind dann die Knoten ungeordnet.
So wie du das hast ist klar.... aber wie erfolgt die Abfrage der Daten?
ImageTools for Silverlight: http://imagetools.codeplex.com | http://www.silverdiagram.net | http://www.cleancodedeveloper.de b:::
Hallo malignate,
ich vermute mal, du meinst mit 'abfragen', den Zugriff per String auf die entsprechende Groupnode.
Wenn die Strings die Groupnodes eindeutig identifizieren, ist eine Hashtable zur Realisierung ganz praktisch. Es könnte eine solche Hashtable als statische Variable in der Klasse Groupnode geben. In diese wird im Konstruktor oder beim Setzen des Strings die aktuelle Groupnode - mit dem String als Key - eingetragen. Eine statische Methode der Klasse Groupnode könnte dann mit Hilfe der Hashtable und dem als Paramter übergebenen String leicht die gewünschte Groupnode zurückliefern.
HTH
herbivore
Hi
@herbivore:
zwei Dinge gefallen mir an deinem Vorschlag nicht so recht
ich würde den Zugriff einfach so machen:
(ausgehend vom oben genannten code, eingefügt in die GroupNode-Klasse)
public INode this[int index] { return nodes[i]; }
public INode this[string name] {
foreach(INode node in nodes)
if (node.Name==name) return node;
return null;
}
Zugriff erfolgt dann ganz einfach über: root["texture"]["data"]
wenn du weißt das das ein Float-Wert sein soll, dann
FloatNode node = root["texture"]["data"] as FloatNode;
if (node==null) // Fehler
node.Value = ...
Hallo tb,
zu 1. die Ordnung in einem Baum entsteht durch die Kanten zwischen den Knoten und nicht durch die mögliche Strukturierung eines zusätzlichen Index. Die Hashtable geht also schon in Ordnung.
zu 2. Natürlich und absichtlich static. Meine Voraussetzung war: "Wenn die Strings die Groupnodes eindeutig identifizieren". Wenn diese Voraussetzung erfüllt ist, handelt es sich hier um einen Index aller zu der Klasse erzeugten Objekte und den Zugriff auf diese per Id. Es ist dabei völlig unerheblich, ob die einzelnen Knoten in einem Baum enthalten sind oder sich auf einen ganzen Wald verteilen. Das static geht also schon in Ordnung. Ob die genannten Methoden als solche sinnvoll sind, steht und fällt mit der Einhaltung der Voraussetzung.
herbivore