Forum: PC-Programmierung C# Konstruktor überladen möglich?


von user (Gast)


Lesenswert?

Guten Abend,

in einer bestehenden C# Anwendung soll der Konstruktor von einer Klasse 
im laufenden Betrieb neu aufgerufen werden.Allerdings sind dann die 
Übergabewerte anders.Kann ein Konstruktor in C# quasi neu gestaret 
werden?

von Horst (Gast)


Lesenswert?

Nein das geht nicht.

von user (Gast)


Lesenswert?

Wie müsste ich alternativ Vorgehen?

von Lucas (Gast)


Lesenswert?

Du schreibst einfach eine privat Methode (ich würde diese "init" 
nennen), die aus dem Konstruktor mit den gewünschten Parametern 
aufgerufen wird. Innerhalb deines Objekts kannst du diese "init" mit den 
neuen Parametern aufrufen. Stell nur sicher, dass alle Felder, 
Eigenschafte zurückgesetzt werden, damit du keine unsauberen Zustände 
hast.

Je nach Scope wäre das erstellen eines neuen Objekts das einfachste, mit 
dem du dein vorhandenes überschreibst.

Sollte das alles nicht passen, würde ich mich mit Creational Patterns 
beschäftigen, im Detail mit dem Builder Pattern.

Als erste Idee:
http://www.dofactory.com/net/design-patterns


Grüße
Lucas

von nicht"Gast" (Gast)


Lesenswert?

Da gibts drei Möglichkeiten.

1. Du machst dir eine Methode, die alles Einrichtet und ruft die aus dem 
ctor heraus auf (und dann mehr oder weniger direkt, wenn du dein Object 
ändern willst)

2. du wirfst das alte Object weg und erstellst ein neues.

3. Du überlegst dir, ob dein bisheriges Konstrukt nicht verbessert 
werden kann.

von NJ (Gast)


Lesenswert?

Hi!

Warum möchtest Du den Konstruktor neu aufrufen?

Hast Du keinen Zugriff auf den Code, um Zugriffsmethoden für die 
Objekteigenschaften hinzuzufügen?

von oop (Gast)


Lesenswert?

Ist irgendwie gehen das Konstruktorprinzip. Der Konstruktor wird bei zur 
Erstellung eines Objekts aufgerufen. Du willst aber an einem bestehenden 
Objekt was ändern. Du brauchst eine neue Methode dafür.

von Lucas (Gast)


Lesenswert?

Wenn NJ recht hat und du eine Bibliothek benutzt, solltest du dir 
Extension Methods anschauen. Damit könntest du eine Extension schreiben, 
die ein neues Objekt erstellt und das vorhandene überschreiben. Fühlt 
sich dann wie eine Methode der Klasse an, hat aber keinen Zugriff auf 
privat oder protected.


https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

Grüße
Lucas

von Dirk (Gast)


Lesenswert?

Hallo, eine Methode ist in diesem Fall auch nicht richtig, weil es 
sicherlich um Eigenschaften des Objekts handelt, deshalb wären hier 
öffentliche Eigenschaften des Objekts besser.

1
public class MyServer
2
{
3
  
4
  public string IP {get;set}
5
  public string Name {get;set}
6
  
7
  //ctor 1 
8
  public MyServer()
9
  {
10
  }
11
  
12
  // ctor 2
13
  public MyServer(string ip, string name)
14
  {
15
    IP = ip;
16
    Name = name;
17
  }
18
  
19
}

von Markus (Gast)


Lesenswert?

Dirk schrieb:
> Hallo, eine Methode ist in diesem Fall auch nicht richtig, weil es
> sicherlich um Eigenschaften des Objekts handelt, deshalb wären hier
> öffentliche Eigenschaften des Objekts besser.
>
> public class MyServer
> {
>
>   public string IP {get;set}
>   public string Name {get;set}
>
>   //ctor 1
>   public MyServer()
>   {
>   }
>
>   // ctor 2
>   public MyServer(string ip, string name)
>   {
>     IP = ip;
>     Name = name;
>   }
>
> }

Damit verlagerst Du aber die Logik vom der aufgerufenen Klasse in die 
aufrufende Methode. Aus Sicht von "Separation of Concerns", Kapselung, 
... völlig falsch.

Grüße
Markus

von Dirk (Gast)


Lesenswert?

Deine Meinung kann ich nich vertreten, weil es in meinem Beispiel nach 
MVVM pattern ein Model ist und über die öffentlichen Eigenschaften 
lassen sich die Eigenschaften durch Viewbinding komfortabel darstellen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.