Ich habe eine Hauptklasse und ein Objekt, das über den Konstruktor auf die Hauptklasse verweist. Die Frage ist, wie ich eine Eigenschaft aus der Hauptklasse innerhalb der Objektklasse ändern kann.

public class First
{
   public int x = 0;
   public Second second;
   public First()
   {
      second = new Second(this);
   }    

   public run()
   {
      second.change();
   }


}
public class Second
{
   private First _first;
   public Second(First first)
   {
       _first = first;
   }

   public change()
   {
      first.x = 2;
   }
}

Ich möchte keine statischen Klassen verwenden, da First tatsächlich eine DLL ist, die in Protrader ausgeführt wird und die wiederum mehrere First-Instanzen parallel ausführen kann. Wenn statische Klassen vorhanden sind, werden Daten zwischen diesen Instanzen verloren gehen. Ich muss also eine Variable in der ersten Klasse ändern, indem ich sie als Parameter an den Konstruktor einer anderen Klasse übergebe. (ref this) funktioniert nicht. Ich habe auch versucht, eine Wrapper-Klasse von first zu erstellen. öffentlicher First Wrapper; und innerhalb des ersten Konstruktors instanziieren Sie Wrapper = this .. und dann second = new Second (ref Wrapper). Das hat kompiliert, aber auch nicht funktioniert.

Der Zweck dieser Übung ist, dass ich eine riesige First Class hatte, die zu einer einzigen DLL kompiliert wird. Protrader lädt eine einzelne DLL und führt sie gleichzeitig auf verschiedenen Instrumenten (Dolar, Iene, Euro usw.) parallel aus. Wenn ich statische Methoden verwende, "lecken" die Zustandssteuerungsvariablen zu anderen Instrumenten und das ruiniert die Logik.

Diese First Class haben bereits 2000 Linien und wachsen weiter. Ich habe beschlossen, es zu modularisieren. Exportieren Sie einige Methoden, die derzeit zur Spezialisierung von Klassen wie Protokoll, Ereignisse, Handelsbefehle usw. erforderlich sind. Diese Klassen ändern jedoch die Eigenschaften untereinander und innerhalb der Hauptklasse.

c#
0
Camilo Chaves 19 Jän. 2019 im 01:29

3 Antworten

Beste Antwort

enter image description here

Es sieht so aus, als ob der Code von Anfang an richtig war. Ich konnte meine DLL aufgrund eines anderen Problems nicht ausführen. Vielen Dank für die Hilfe!

0
Camilo Chaves 18 Jän. 2019 im 23:51

Können Sie nicht einfach eine Funktion innerhalb der First-Klasse erstellen, die die Variable ändern kann?

Wie so:

public class First
{
   public int x = 0;
   public Second second;
   public First()
   {
      second = new Second(this);
   }    

   public run()
   {
      second.change();
   }

   public modifyX(int changedX)
   {
       x = changedX
   }

}
public class Second
{
   private First _first;
   public Second(First first)
   {
       _first = first;
   }

   public change()
   {
      _first.modifyX(2);
   }
}
0
DJ Burb 18 Jän. 2019 im 22:41

Die Eigenschaft x in der Klasse First könnte auch als geschrieben werden

private int _x;
public int x
{
    get { return _x; }
    set { _x = value; }
}

Ich habe einige geringfügige Änderungen an dem von Ihnen bereitgestellten Code vorgenommen und hoffe, dass dies hilfreich ist

public class First
{
    public int x { get; set; }

    public Second second;
    public First()
    {
        x = 0;
        second = new Second(this);
    }    

    public void run()
    {
        second.change();
    }


}
public class Second
{
    private First _first;
    public Second(First first)
    {
        _first = first;
    }

    public void change()
    {
        _first.x = 2;
    }
}
0
Andrew 18 Jän. 2019 im 22:47