Wie sollte/kann man neue Objekte/Instanzen einer Klasse dynamisch benennen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wie sollte/kann man neue Objekte/Instanzen einer Klasse dynamisch benennen

    Hi,

    wieder mal Grundlagenwissen... aus Übungszwecken hab ich eine Klasse Monkey.cs erstellt:

    C#-Quellcode

    1. ​public class Monkey
    2. {
    3. public String Name;
    4. public Int32 Nr;
    5. public static Int32 Population;
    6. public Monkey (String n) {
    7. Name = n;
    8. Nr = Population;
    9. Population += 1;
    10. }
    11. }


    Eine Instanz eines Monkeys hat also einen Namen, eine Laufende Nr. und jede erzeugte Instanz beinhaltet die aktuelle Gesamtanzahl der Population.

    Wie soll/kann ich jetzt zur Laufzeit dynamisch die Namen der neuen Instanzen erzeugen? MonkeyEins,MonkeyZwei, ...

    C#-Quellcode

    1. private void BtEnterName_Click(object sender, EventArgs e)
    2. {
    3. Monkey MonkeyEins = new Monkey(TxtBxEnterName.Text);
    4. }
    codewars.com Rank: 4 kyu
    @ErfinderDesRades So hab ich das leider nicht gemeint. Nicht der Name in der Klasse ist das Problem.

    Eine Textbox und ein Button sind auf einer Form. Der Benutzer Tippt den Namen des Affen in die Textbox und klickt auf den Button -> Jetzt soll ein Objekt der Klasse Monkey erzeugt werden und die Benamung diese Objektes macht mir Probleme (nicht der Name des Affen der übergeben wird).

    Es gibt doch diese vielen Beispiele zu Klassen mit den Autos (Farbe, Türen, Hupen etc.). Aber wie erzeuge ich z.B. zehn oder mehr Objekte dieser Klassen mit eindeutigem Namen zur Laufzeit (ohne zu wisse wie viele es werden).

    Oder ist das ein falsches Verständnis von Klassen und alle Instanzen sollten schon beim Kompilieren bekannt / benannt sein.
    Sehe ich Klassenobjekte fälschlicherweise eher als sowas wie "Datensätze"?!
    codewars.com Rank: 4 kyu
    Es geht Dir also um die Benennung der Laufzeit-Variablen, nicht Setzung des Name-Felds. Falls nicht, korrigier mich. Falls doch: Nimm eine List(Of Monkey), statt einzelne Monkey-Variablen zu erzeugen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    nogood schrieb:

    Es gibt doch diese vielen Beispiele zu Klassen mit den Autos (Farbe, Türen, Hupen etc.). Aber wie erzeuge ich z.B. zehn oder mehr Objekte dieser Klassen mit eindeutigem Namen zur Laufzeit (ohne zu wisse wie viele es werden).
    jedes einzelne mit eigenem, eindeutigem Namen - zur Laufzeit - garnet.
    Wenn du zur Laufzeit viele Objekte einer Klasse haben willst, tu sie in eine List<Klasse>

    Mir scheint, du verstehst hier unter "Name", was glaub "CodeName" heisst - also etwas, was ein Programmierer in den Editor tippt.

    C#-Quellcode

    1. private Monkey MonkeyZwei;
    MonkeyZwei ist hier ein CodeName - und sowas kannste nicht zur Laufzeit erzeugen - wäre auch Quatsch.
    CodeNamen sind etwas, womit weiterer Code was anfangen kann. Da bräuchtest du ja noch einen weiteren Button, der den Code erzeugt, der mit deinem neuen CodeNamen, der da plötzlich in deim Code steht, was anfangen kann.
    Und wann soll das Zeug kompiliert werden??
    @ErfinderDesRades Jou.
    @nogood Wenn die Instanzen dynamisch erzeugt werden, kannst Du ihnen iwie schlecht einen Namen im Code vorgeben.
    Wenn es dann mehrere werden, wird das noch schlechter.
    Pack die in eine List(Of Monkey) in die Klasse, nicht aber in die Prozedur.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @VaporiZed @ErfinderDesRades @RodFromGermany Ja Danke hat so geklappt hab die instanzierten Objekte in eine List<Klasse> / List Of "gepackt".

    Monkey.cs (KlassenDatei)

    Form1.cs (Datei wo der Rest drin ist auch die Liste)

    In der Form1 passiert die Instanzierung und dort werden die Objekte dann auch in der List Of gespeichert.


    @RodFromGermany

    ​Pack die in eine List(Of Monkey) in die Klasse, nicht aber in die Prozedur.


    Wie soll das gehen ? Oder was meinst Du damit?
    codewars.com Rank: 4 kyu

    nogood schrieb:

    Wie soll das gehen ? Oder was meinst Du damit?
    Nicht so:

    C#-Quellcode

    1. ​private void doIt()
    2. {
    3. List<Monkey> monkeys = new List<Monkey>();
    4. monkeys.Add(new Monkey());
    5. }

    sondern so:

    C#-Quellcode

    1. ​private List<Monkey> monkeys = new List<Monkey>();
    2. ​private void doIt()
    3. {
    4. monkeys.Add(new Monkey());
    5. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. public List<Monkey> LstOfMonkeys = new List<Monkey>();
    4. public Form1()
    5. {
    6. InitializeComponent();
    7. }
    8. private void BtEnterName_Click(object sender, EventArgs e)
    9. {
    10. //Monkey NeuerMonkey = new Monkey(TxEnterName.Text);
    11. //LstOfMonkeys.Add(NeuerMonkey);
    12. //oder kürzer
    13. LstOfMonkeys.Add(new Monkey(TxEnterName.Text));
    14. TxEnterName.Clear();
    15. }
    16. }


    So hab ich es jetzt geschrieben. Ist das so wie man es machen sollte? Ich frage nochmal da mich die Aussage pack die List Of in die Klasse verwirrt hat. Danke ...
    codewars.com Rank: 4 kyu

    nogood schrieb:

    verwirrt
    Eine Instanz von was auch immer kann in einer Klasse oder einer Prozedur gehalten werden, dadurch wird der Scope (Sichtbarkeit einer Instanz) definiert..
    Wenn die Instanz in der Klasse liegt, kannst Du die Instanziierung ebenfalls in der Klasse machen, diese Zeile wird dann vom Konstruktor aus aufgerufen.
    Oder Du machst die Instanziierung in einer Init-Prozedur, wenn viel zu initialisieren ist.
    Das ist Geschmackssache.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!