Autor Beitrag
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Do 04.12.08 16:08 
Hallo,

sorry erstmal für den unverständlichen Titel. Mir ist nichts besseres eingefallen.

Zum Problem: Ich möchte eine Baumstruktur mit mehreren unterschiedlichen Datentypen füllen. Dafür habe ich eine generische Klasse erstellt, welche Funktionen zur Bearbeitung der einzelnen Datentypen bereitstellt.
Der Baum selber soll nun die generischen Klassen als Kinder haben, aber ohne vorher festzulegen, welchen Typ diese haben müssen.

Wie löse ich das Problem?

Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public class Daten<T>
{
  // verschiedene Eigenschaften vom Typ T
}

public class Knoten
{
  public Knoten Parent;
  public Daten<????> FirstChild;     //wie implementiere ich jetzt Kinder und Geschwister von der generischen Klasse
  public Daten<????> FirstSibling;   //ohne vorher zu wissen von welchem Typ diese sind?
}


P.S.: Kann man where auch auf Klassen anwenden? Hätte gern sowas wie
ausblenden C#-Quelltext
1:
public class Daten<T> where T: String, Int32.....					

Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 04.12.08 16:34 
Na, dann antworte ich mal, um zu helfen -)

Du solltest deine beiden Eigenschaften FirstChild und FirstSibling auf jeden Fall vom Typ Knoten machen (die Knoten sind untereinander verbunden, nicht die Daten).
Dann bekommt deine Knotenklasse nur noch EINE zusätzliche Eigenschaft mit den Daten.
Am einfachsten ist es, wenn du einfach ein Interface IDaten definierst und dieses dann als Typ für den Knoten verwendest. So braucht der Knoten nichts direkt von T zu wissen.

Wenn du jedoch deinen gesamten Baum, so anlegen willst, daß immer nur der selbe Datentyp für T benutzt wird, dann mach auch einfach den Baum sowie die Knoten generisch: Tree<T> und Knoten<T>.

Ich hoffe, dies reicht aus, um dir Hilfe zur Selbsthilfe zu geben...

P.S: 'where' kann man auch auf Klassen anwenden, jedoch sollten als Datentypen immer Schnittstellen (Interfaces) angegeben werden, sonst kann man ja keine Methoden auf die Objekte vom Typ T anwenden (außer die von Object). Es gibt auch noch 'class' und 'struct' als Möglichkeit, um nur Referenz- bzw. Werttypen zuzulassen.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 04.12.08 18:07 
Ergänzung zum PS von Th69: Ich meine, dass in der where-Klausel ohne Weiteres auch Klassen angegeben werden können. Aber das sind immer AND-Bedingungen. Deine (Hape) Idee mit "where: string, int" klappt also nicht. In einer vergleichbaren Situation hatte ich "where T: struct, IComparable" benutzt.

Zum Hauptproblem will ich lieber nichts sagen, weil ich mich mit Bäumen noch nicht befasst habe.

Jürgen
wulfskin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Do 04.12.08 22:18 
Hallo,

danke für die Antworten. Was ich immer noch nicht verstehe: Wie kann ich den unterschiedliche Daten in einem Knoten speichern (am besten mit generischen Typen)?

Der Typ ist aber jeweils erst zur Laufzeit bekannt und muss dynamisch angelegt werden.

Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 04.12.08 22:52 
user profile iconwulfskin hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich den unterschiedliche Daten in einem Knoten speichern (am besten mit generischen Typen)?
Dabei bringen dir Generics wenig, da der Compiler schlecht zur Kompilierzeit überprüfen kann, welchen Typ die Objekte zur Laufzeit haben. In den allermeisten Fällen interessiert einen aber der genaue Typ gar nicht, nämlich dann, wenn alle Objekte ein Interface implementieren und man sich nur für dessen Member interessiert. Dann kannst du das Interface als Typparameter benutzen und hast wieder eine typsichere Collection.

_________________
>λ=