Unterobjekte

Paranoia

Erfahrenes Mitglied
Hallo

Ich beschäftige mich derzeit mit Objekten in Objekten. Um diese Aussage etwas verständlicher zu machen, hier ein Beispiel anhand einer DataTable:

Code:
DataTable dt = new DataTable();

dt.Columns.Add();
dt.Columns[0].Caption = "Col 1";
dt.Columns[0].MaxLength = 25;


So etwas in dieser Art möchte ich nun gerne mit eigenen Klassen bewerkstelligen. So in der Art wie folgt beschrieben:


Code:
class Value1
{
	public string name;
	public string description;
	public Value2[] value2;
}
class Value2
{
	public string code;
	public string language;
	public string _value;

	public void add(){}
}

Schön wäre es natürlich, wenn so etwas auch mit Properties möglich ist. :)
Ich wäre froh, wenn mich jemand darüber aufklären könnte mit einem Beispiel. Besten Dank schon im Voraus.
 
Entweder liegts an der gestrigen/heutigen Feier, oder ich versteh wirklich nicht was genau du willst. Kannst es vielleicht ein wenig genauer erklären?

Ich denke mal, dass du Objekte in einem Objekt speichern willst, aber was genau willst du bezwecken?
 
Oki, ich versuche das ganze etwas besser zu erklären:

Mein Ziel ist es, in einem Objekt Kopfdaten (Value1: Name, Bezeichnung) und in Unterobjekten beliebig viele Detaildaten (Value2: Code, Sprache, Wert) zu erfassen und anschliessend in einer Datenbank zu speichern.

Die Datenstruktur sieht demzufolge so aus:

Name | Bezeichnung
-----------------------------
Code1 | Sprache1 | Wert1
Code2 | Sprache2 | Wert2
Code3 | Sprache3 | Wert3
etc.

Das ganze möchte ich halt analog der DataTable mit eigenen Klassen programmieren:


Code:
Value1 v1 = new Value1();

v1.name = "Name";
v1.description = "Bezeichnung";

v1.Value2.add();
v1.Value2[0].code = "ABC";
v1.Value2[0].language = "de";
v1.Value2[0]._value = "Wert 1";

Das ganze möchte ich mit Properties und nicht unbedingt mit public Variablen programmieren. Ohne Properties krieg ich das mehr oder weniger hin. Aber das Ganze mit Properties zu programmieren, daran bin ich gescheitert.

Ich habe das halbe Internet umgekrempelt aber nix gefunden :(
 
Zuletzt bearbeitet:
Ich würde an deiner Stelle eine eigene typsichere Collection (ein deinem Fall wohl etwas wie eine ArrayList) erstellen.

Dazu kannst du entweder von ArrayList erben und die Methoden verdecken (ist aber "schlechtes Design", so wie ich finde) oder du erbst von CollectionBase, welches schon einige Funktionalitäten bereitstellt. Die letzte Möglichkeit wäre, einfach die benötigten Interfaces (IList, ICollection, was immer du brauchst) zu implementieren und den Rest selber zu schreiben.

Dadurch kannst du in deiner ArrayList (die nur Objekt vom Typ Value2 entgegennimmt), diese dann einfach mit der Add-Methode hinzufügen oder entfernen. Dies kannst du ja mit einem normalen Array nicht, da dies eine festgelegt Größe hat.

Letztens habe ich im VB.NET Forum (sogar in C#) ein Beispiel dazu gepostet. Ansonsten such einfach mal nach "typsicheren Auflistungen", "typesafe collections". Da findest du bei Google mehr als genug zu...
 
zovax, ich glaube, du hast mich da auf die richtige Spur gebracht. Ich bin zu folgender Lösung gekommen:

Code:
public class Kopf
{
	private string s_name;
	private string s_description;

	private DetailCollection dc;

	public Kopf()
	{
		this.s_name        = "";
		this.s_description = "";
		this.dc            = new DetailCollection();
	}

	public Kopf(string Name, string Description)
	{
		this.s_name        = Name;
		this.s_description = Description;
		this.dc            = new DetailCollection();
	}

	public string Name
	{
		get{ return s_name; }
		set{ s_name = value; }
	}

	public string Description
	{
		get{ return s_description; }
		set{ s_description = value; }
	}

	public DetailCollection Details
	{
		get { return dc; }
		set { this.dc = value; }
	}
}

public class Detail
{
	private string s_code;
	private string s_language;
	private string s_value;

	public Detail()
	{
		this.s_code     = "";
		this.s_language = "";
		this.s_value    = "";
	}

	public Detail(string Code, string Language, string Value)
	{
		this.s_code     = Code;
		this.s_language = Language;
		this.s_value    = Value;
	}

	public string Code
	{
		get{ return s_code; }
		set{ s_code = value; }
	}

	public string Language
	{
		get{ return s_language; }
		set{ s_language = value; }
	}

	public string Value
	{
		get{ return s_value; }
		set{ s_value = value; }
	}
}

public class DetailCollection : CollectionBase
{
	public Detail this[int index]
	{
		get { return (Detail) this.List[index]; }
		set { this.List[index] = value; }
	}

	public void add()
	{
		this.List.Add(new Detail());
	}

	public void add(Detail detail)
	{
		this.List.Add(detail);
	}
}

Anschliessend habe ich mit folgendem Code Werte eingegeben und wieder ausgegeben (ASP.NET in diesem Fall):

Code:
Kopf k = new Kopf();

k.Name = "Name";
k.Description = "Description";
k.Details.add();
k.Details[0].Code     = "Code1";
k.Details[0].Language = "Language1";
k.Details[0].Value    = "Value1";

k.Details.add(new Detail("Code2","Language2","Value2"));

Response.Write(k.Name + "; " + k.Description + "<br><br>");

foreach(Detail d in k.Details)
{
	Response.Write(d.Code + "; " + d.Language + "; " + d.Value + "<br>");
}

Gerne würde ich ein paar Feedbacks dazu erhalten. Vielleicht hat jemand noch ein paar gute Erweiterungs- bzw. Verbesserungs-Tipps :)
 
Zurück