Konstrukturaufruf innerhlab einer Klasse



  • Wie kann ich innerhalb einer klasse, den eigenen Konstruktor aufrufen?



  • Servus,

    ???? gib uns mal ein Beispiel, was du meinst....

    public class Mooh
    {
      public Mooh()
      {
         // Mein Konstruktor????
      }
    }
    
    Mooh m = new Mooh();
    

    meinst du das???

    mfg
    Hellsgore



  • Eigentlich will ich kein neues Objekt erzeugen und außerdem soll der Aufruf
    innerhlab der Klasse stattfinden.

    public class Mooh
    {
      public Mooh()
      {
         //Hier möchte ich zB. den überladenen Konstruktor aufrufen
         //Bsp.: Mooh(3);  <- geht aber nicht so!
      }
    
      public Mooh(int value)
      {
         _value = value;
      }
    }
    


  • public class Mooh
    {
      public Mooh() : Mooh(3)
      {
         // andere Anweisungen
      }
    
      public Mooh(int value)
      {
         _value = value;
      }
    }
    

    Ich hoffe das beantwortet deine Frage.
    mfg cx



  • Und wie kann ich aus einer anderen Stelle, zB. Methode, den Konstruktor aufrufen?



  • Ansich gar nicht, Du könntest höchstens über eine Methode die Objekte erstellen, das ist aber ziemlich gegen das Prinzip der OOP.
    z.B.

    class Mooh
    {
        int x;
        int y;
        string name;
    
        public Mooh()
        {
            constructor(0, 0, "unbenannt");
        }
    
        public Mooh(int X, int Y)
        {
            constructor(X, Y, "unbenannt");
        }
    
        public Mooh(string Name)
        {
            constructor(0, 0, Name);
        }
    
        public Mooh(int X, int Y, string Name)
        {
            constructor(X, Y, Name);
        }
    
        private void constructor(int X, int Y, string Name)
        {
            x = X;
            y = Y;
            name = Name;
        }
    
        public void Reset()
        {
            constructor(0, 0, "unbenannt");
        }
    }
    

    Ist aber eine ziemlich unschöne Variante. Wobei musst du denn den Konstruktor aufrufen?

    mfg cx



  • Mir geht es um die überladenen Konstrukturen.
    Wenn ein Konstruktur ein Argument mehr erwartet, so muss ich den ganzen
    Konstruktur kopieren und den neuen Parameter hinzufügen.

    Bsp:
    So sieht es im Moment aus:

    public class Mooh
    {
      public Mooh()
      {
      }
    
      public Mooh(int value)
      {
         _value = value;
      }
    
      public Mooh(int value, int x)
      {
         _value = value;
         _x = x;
      }
    
      public Mooh(int value, int x, int y)
      {
         _value = value;
         _x = x;
         _y = y;
      }
    
    }
    

    So möchte ich es haben:

    public class Mooh
    {
      public Mooh()
      {
      }
    
      public Mooh(int value)
      {
         _value = value;
      }
    
      public Mooh(int value, int x)
      {
          Mooh(value);
         _x = x;
      }
    
      public Mooh(int value, int x, int y)
      {
         Mooh(value, x)
         _y = y;
      }
    }
    

    In C++ war das möglich.
    Ich finde es auch komisch, dass C# keine Defaultwerte zulässt!



  • brainwave81 schrieb:

    So möchte ich es haben:

    public class Mooh
    {
      public Mooh()
      {
      }
    
      public Mooh(int value)
      {
         _value = value;
      }
    
      public Mooh(int value, int x)
      {
          Mooh(value);
         _x = x;
      }
    
      public Mooh(int value, int x, int y)
      {
         Mooh(value, x)
         _y = y;
      }
    }
    

    In C++ war das möglich.
    Ich finde es auch komisch, dass C# keine Defaultwerte zulässt!

    public class Mooh
    {
      public Mooh() : this(defaultValue)
      {
      }
    
      public Mooh(int value) : this(value, defaultX)
      {
      }
    
      public Mooh(int value, int x) : this(value, x, defaultY)
      {
      }
    
      public Mooh(int value, int x, int y)
      {
         _value = value;
         _x = x;
         _y = y;
      }
    }
    

    Wenn du die Frage falsch stellst, dann dauert es halt länger, bis du die erwartete Antwort bekommst. 😉

    Btw. ist sowas in C++ nicht möglich. Default-Parameter sind möglich, aber den Pseudo-Code den du zeigtest ist in C++ nicht möglich. Hoffentlich ist jetzt deine Frage trotzdem beantwortet, amsonsten bitte komplett neu stellen.



  • Ich habe eben gelesen, dass es ab der Version 3.0, wieder Defaultwerte eingeführt werden 👍



  • Das stimmt zum Glück nicht.



  • OK. Meine Fragestellung war nicht korrekt.
    Eigentlich wollte ich den Aufruf aus dem Konstruktur wissen.

    Aber was meine Fragestellung abetrifft: "Konstrukturaufruf innerhalb einer
    Klasse" ist also nicht möglich, oder?

    Ps: Natrülich war das nur ein "Pseudocode". In C++ werden die Konstrukturen
    selbstverständlich anders aufgerufen.



  • Ich ziehe meine Aussagen von vorhin zurück! Das hier ist neu:

    Im C#-3.0-Code gibt es keinen Konstruktor, welcher der Instantiierung des Objekts entspricht. Somit müssen Entwickler nicht mehr für das Festlegen unterschiedlicher Eigenschaftswerte einen eigenen Konstruktor erstellen

    Das wird den Code unlesbar machen, jedoch finde ich die Idee gut!



  • brainwave81 schrieb:

    Aber was meine Fragestellung abetrifft: "Konstrukturaufruf innerhalb einer
    Klasse" ist also nicht möglich, oder?

    Für ein fertig konstruiertes Objekt kannst du den Konstruktor nicht mehr aufrufen, nein. Genau wie in C++. Generell kannst du natürlich den Konstruktor aufrufen, aber damit erzeugst du ein neues Objekt. Genau wie in C++.

    Ps: Natrülich war das nur ein "Pseudocode". In C++ werden die Konstrukturen
    selbstverständlich anders aufgerufen.

    Ja und es geht auch dort nicht, Konstruktoren für bereits konstruierte Objekte aufzurufen, und es geht auch nicht, einen Konstruktor einen anderen aufrufen zu lassen. Also, was genau geht denn jetzt dort? Mir ist das immer noch völlig unklar. 😕



  • Ich bin jetzt auch leicht verwirrt. 🙂 Logisch, mein Pseudocode kann nicht funktionieren. Eigentlich wollte ich nur das, was du gezeigt hast wissen.
    Danke!



  • Eine Frage habe ich noch:

    public Mooh() : this(defaultValue) 
      { 
      }
    

    Warum brauche ich das hier?



  • Naja ich dachte, das wolltest du haben. Also der Code macht folgendes: Wenn du den Standardkonstruktor benutzt, dann ruft der Standardkonstruktor hier den Konstruktor mit 1 Parameter auf. Anschließend wird der Code im Rumpf ausgeführt (nichts in diesem Fall). Die Klasse macht in diesem Beispiel also nie was anderes als mehr oder weniger indirekt den Konstruktor mit allen Parametern zu benutzen, fehlende Parameter werden von den Konstruktoren mit weniger Parametern vorgegeben. Am besten, du machst mal new Mooh() und stepst das im Debugger durch.


Anmelden zum Antworten