2016-04-03 3 views
0

Wie die Titel sagt, muss ich ein Array von Singleton-Klasse implementieren. Meine Projektidee baut eine einfache PLC-Ladder-IDE, die in Microsoft Visual C# geschrieben wurde.
Da ich kein Experte Code-Writer bin, schrieb ich einen großen Teil meines Codes in einer einzigen Datei. Es funktionierte einwandfrei, aber es war nicht einfach zu lesen und zu aktualisieren. Also habe ich es in fünf verschiedene Klassen aufgeteilt.Array der Singleton-Klasse

MainClass.cs - Main program 
CustomMethods.cs - All my methods 
CustomEventHandlers.cs - All my event handlers 
Components.cs - This class holds information (name, type, input, output, etc) and I need a 2-D array of this, because I'm using it as a "screen buffer" for the project. 
SharedVariables.cs - All my variables are declared here. My components class is initialized as a 2-D array in here too. 

Das Problem ist, dass ich nicht schaffen kann und eine Instanz von „Komponenten“ Array zwischen meinen Klassen teilen. Ich habe das "Singleton-Muster" gefunden, kann es aber immer noch nicht richtig implementieren. Ich kann mein Array der Singleton-Klasse nicht initialisieren. Hier ist der Code (irrelevante Teile werden ausgeschnitten).

//Custom method.cs 
namespace AVR_PLC 
{ 
    class CustomMethods 
    { 
     CustomEventHandlers extHandlers; 
     SharedVariables Variables; 

     public void setup() 
     { 
      extHandlers = new CustomEventHandlers(); 
      Variables = new SharedVariables(); 

       for (int i = 0; i < Variables.maxX; i++) 
        for (int j = 0; j < Variables.maxY; j++) 
         Variables.pBuffer[i, j] = new Components; 
     } 
--------------------------------------------- 
//SharedVariables.cs 
namespace AVR_PLC 
{ 
    class SharedVariables 
    { 
     public int maxX = 10; 
     public int maxY = 100; 
     public Components[,] pBuffer = Components[10, 100]; //Panel buffer 

    } 
} 
--------------------------------------------- 
//Components.cs 
namespace AVR_PLC 
{ 
    public class Components 
    { 
     //***** Singleton pattern implementation *********** 
     //Private static object. 
     private static volatile Components instance; 
     private static readonly object mutex = new Object(); 

     //Private constructor to prevent object creation. 
     private Components() 
     { 

     } 

     //Public property to access outside of the class to create an object. 
     public static Components Instance 
     { 
      get 
      { 
       if (instance == null) 
        lock (mutex) 
         if (instance == null) 
          instance = new Components(); 
       return instance; 
      } 
     } 
     //************************************************ 
     private string _name = "Default name"; 

     public string Name 
     { 
      get { return this._name; } 
      set { this._name = value; } 
     } 
     public void reset() 
     { 
      _name = "Default name"; 
     } 
    } 
} 
+1

Array von Singleton klingt wie ein Widerspruch. Der Zweck von Singleton ist, dass Sie nur eine Instanz einer Klasse haben. Ein Array davon erscheint seltsam. – derpirscher

+0

Wie kann ich eine einzelne Klasseninstanz für mehrere Klassen verwenden? Das ist mein Problem. Die Klasse in meinem Code oben ist verkürzt. Es enthält mehr Variablen (Typ, Eingabe, Ausgabe, Kommentar usw.) – ThymiosK

+0

Sie müssen wirklich objektorientierte Programmierung lernen. Was Sie geschrieben haben, ist God-Object Anti-Pattern –

Antwort

0

Ein Singleton ist eine Klasse, die es nur eine Instanz ist (Persönlich, wenn C# ziehe ich statische Klassen statt Singletons).

Um auf die Singleton-Klasse zuzugreifen, verwenden Sie die Eigenschaft Components.Instance. Aber in deinem Fall willst du eigentlich kein Singleton.
Wenn Sie ein Array von Component-Objekten haben möchten, möchten Sie lieber ein neues für jedes neue Objekt im Array erstellen, sonst ist das Array irgendwie nutzlos (wenn es genau dasselbe Objekt enthält).

Um eine Variable zwischen mehreren Instanzen der gleichen Klasse zu teilen, verwenden Sie das Schlüsselwort static, was es im Grunde über alle Klassen zum selben Objekt macht (wenn Sie es in einem ändern, ändert es sich).
So könnten Sie einfach Ihre freigegebenen Variablen Klasse eine statische Klasse machen:

public static class SharedVariables 
{ 
    public static int maxX = 10; 
    public static int maxY = 100; 
    public static Components[,] pBuffer = Components[10, 100]; 
} 

Und werden sie erreichbar sein, wohin Sie die SharedVariables Klasse zugreifen.

Die große Frage ist aber: Brauchen Sie wirklich eine statische SharedVariables Klasse? Ich vermute, du hast ein Designproblem, über das du nachdenken solltest.

+0

Die Sache ist, ich habe eine große Anzahl von Variablen in meiner SharedVariable-Klasse. Sollte ich das statische Schlüsselwort überall verwenden? Ich glaube, ich habe sowas wie einen statischen Konstruktor für Klassen gesehen. Ich bin mir nicht sicher. Gibt es so etwas? – ThymiosK

+0

Es gibt einen statischen Konstruktor ja. Du könntest deine SharedVariables-Klasse zu einem Singleton machen, wenn du nicht alle statischen Eigenschaften verwenden willst, aber persönlich würde ich darüber nachdenken, ob die Klasse überhaupt existiert und die Variablen nicht in anderen Klassen platziert und dort privat gehalten werden sollten. Ich kann jedoch nichts sicher sagen, da ich den ganzen Code nicht gesehen habe: P – Jite

+0

Also im Grunde alles, was Sie tun müssen, um Ihren aktuellen Code zu arbeiten, ist die Implementierung der 'Singleton-Muster' in der' SharedVariables' Klasse anstelle der 'Components' Klasse, dann greifen Sie über' SharedVariables.Instance.Property; 'statt' SharedVariables.Property' zu; – Jite