"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[C#/OOP] Objekte dynamisch benamseln

Hansmaulwurf 03.12.2009 - 11:40 3864 14
Posts

Hansmaulwurf

u wot m8?
Avatar
Registered: Apr 2005
Location: VBG
Posts: 5639
Hiho.
Hab eine Frage bezüglich C# und Objekten. Folgendes, ich hab Klassen Huhn und Schaf. Die sollen auf einer Wiese rumlaufen und haben bestimmte Werte (Pos-x, Pos-y, Hunger, ...) aber ich will das der User eingeben kann wie viele Schafe er gern hätte, Parameter bekommen sie eh per Zufall.

Also quasi User sagt "Gib mir 5 Schafe" und er erzeugt die Objekte wie folgend:
Code:
schaf dolly1 = new schaf();
schaf dolly2 = new schaf();
...
schaf dolly5 = new schaf();

Wie kann ich das am gescheitesten machen, damit er mir die dynamisch erzeugt ?

Danke schonmal :)

Neo1010

.
Registered: May 2003
Location: -
Posts: 1212
naja falls ich das richtig verstanden hab am besten gleich mit array.

n=anzahl der schafe

schleife .. i=0....i->n.
schafe["dolly" + i]=new schaf();
end

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12070
Dafuer gibt es entsprechende Datenstrukturen, wie z. B. Arrays oder Vektoren. Diese kannst du wohl auch in C# mit Referenzdatentypen befuellen.

In manchen Sprachen kann man (neue) Variablennamen dynamisch aus anderen Variablen zusammensetzen (Indirektion), das ist aber ziemlich dreckig.

quilty

Ich schau nur
Avatar
Registered: Jul 2005
Location: 4202
Posts: 3017
Er will ja nur eine dynamische Liste. :)

Code:
List<Schaf> meineSchafe = new List<Schaf>();
// ... lese anzahlSchafe vom User
for (int i = 0; i < anzahlSchafe; i++)
  meineSchafe.Add(new Schaf());

Bissl über die Liste iterieren (die Frage kommt sicher auch noch).

Code:
foreach (Schaf schaf in meineSchafe)
{
  if(schaf.Alter > 1)
    schaf.AbZurSchlachtbank();
}

// die Schafe könne auch über deren Index angesprochen werden z.B.
meineSchafe[3].Color = Colors.Black.
Bearbeitet von quilty am 03.12.2009, 12:01

Hansmaulwurf

u wot m8?
Avatar
Registered: Apr 2005
Location: VBG
Posts: 5639
Zitat von Neo1010
naja falls ich das richtig verstanden hab am besten gleich mit array.

n=anzahl der schafe

schleife .. i=0....i->n.
schafe["dolly" + i]=new schaf();
end
Das geht eben nicht, da C# iwie nur reine Strings als Variablennamen nimmt, und keine anderen Variablen.

@COLLO : hä ?
Ich versteh nicht ganz wie ich mir das Objekte erstellen spar, wenn ich Referenzen verwende. Klar wie ich drauf zugreif und sie füll, vorher muss ich sie aber erstellen, oder steh ich am Schlauch ?

Neo1010

.
Registered: May 2003
Location: -
Posts: 1212
hab zwar noch nicht so viel mit c# gearbeitet aber ich bin mir doch recht sicher das auch Stringverkettung in c# gibt ;)

und somit müsstest schon irgendwie "dolly" und deine laufvariable verketten können und somit als namen in zb. einem Array vergeben

tresh

Little Overclocker
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 73
Fuer sowas verwendet man normal Container und nicht arrays. Arrays sind nicht dynamisch. Ich kenn mich mit C# nicht aus, aber wahrscheinlich (hoffe ich zumindest) wird es irgendwelche dynamischen Containerklassen fuer z.B. Listen geben.

Neo1010

.
Registered: May 2003
Location: -
Posts: 1212
ja gibt es, wie schon von quilty angesprochen wäre dyn. liste wahrscheinlich eine der besten varianten

Hansmaulwurf

u wot m8?
Avatar
Registered: Apr 2005
Location: VBG
Posts: 5639
Danke @ quilty.
Aber heißen jetzt nicht alle Schafe "Schaf" und ich hab nur ein Objekt überladen ? Wobei dann sollt ich sie auch durch ne durchgehende Nummer identifizieren können wie zB Schaf.ID, oder ?

thx an alle auf jeden fall :)

edi:/ Ok, hat sich erledigt, steht eh noch unten in weiser Voraussicht :D

tresh

Little Overclocker
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 73
Dann musst du den Objekten irgendwie eine Identifikation zukommen lassen :)

quilty

Ich schau nur
Avatar
Registered: Jul 2005
Location: 4202
Posts: 3017
Zitat von tresh
Dann musst du den Objekten irgendwie eine Identifikation zukommen lassen :)

Müssen nicht, wenn es ihm reicht sie über den Index identifizieren zu können bzw. Vergleiche über den Standard == Operator von object.

Er kann der Schaf-Klasse natürlich ein Namens-Property verpassen, was jedoch wieder subopimal ist, weil vielleicht bekommt er ja mal ein auswärtiges Schaf das zufällig den gleichen Namen hat. Besser wäre eine Eindeutige ID wie z.B. die Ohrmarke oder so.

Alternativ kann er seine Schafe auch in ein Dictionary werfen um sie als Key-Value-Pairs (Name-Schaf) zu halten. Dann weiß das Schaf selbst nichts vom Namen, sondern nur der "Halter". Das ist aber eher etwas für spezielle Situationen.

Btw. falls du nicht explizit andere Coding Guidelines befolgen musst sind Klassen in C#/.NET mit einem Großbuchstaben zu beginnen. (also Schaf statt schaf)

BuSHidO

ist süß
Registered: Jul 2001
Location: galaxie
Posts: 542
In java tät mas ca so machen:

List<Schaf> = new List();

Schaf schaf1 = new Schaf("Karl");
Schaf schaf2 = new Schaf("Lisa");

List.add(schaf1);
List.add(schaf2);

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von BuSHidO
In java tät mas ca so machen:

List<Schaf> = new List();

Schaf schaf1 = new Schaf("Karl");
Schaf schaf2 = new Schaf("Lisa");

List.add(schaf1);
List.add(schaf2);
Das bezweifle ich stark, weil List in Java ein Interface ist (und nebenbei noch generisch) und du nur einen Datentyp angibst aber keinen Variablennamen, würde deine erste Zeile gleich mal einen Error werfen.

repi

Addicted
Avatar
Registered: Jan 2004
Location: Sollenau
Posts: 508
Zitat von BuSHidO
In java tät mas ca so machen:

List<Schaf> = new List();

Schaf schaf1 = new Schaf("Karl");
Schaf schaf2 = new Schaf("Lisa");

List.add(schaf1);
List.add(schaf2);

stimmt net ganz.

ArrayList<Schaf> list = new ArrayList(); //sollt klappen
//weiterer Code

so hast du eine generische liste mit namen 'list' die nur Objekte vom Typ Schaf aufnimmt.
hoffe ich hab mich nicht verhaut.

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3279
naja, eigentlich List<Schaf> list = new ArrayList<Schaf>(); , wenn man brav gegen interfaces programmiert wie sich das gehört, und keine unchecked warnings haben will ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz