2016-04-03 4 views
0

Как говорится в заголовках, мне нужно реализовать массив одноэлементных классов. Моя идея проекта заключается в создании простой PLC-Ladder IDE, написанной на Microsoft Visual C#.
Поскольку я не эксперт по написанию кода, я написал большую часть своего кода в одном файле. Он работал правильно, но читать и обновлять его было нелегко. Поэтому я разделил его на пять разных классов.Array of Singleton class

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. 

Проблема в том, что я не могу создать и совместно использовать экземпляр массива «Компоненты» между моими классами. Я нашел «шаблон Singleton», но все же я не могу его правильно реализовать. Я не могу инициализировать свой массив «singleton». Вот код (нерелевантные части вырезаны).

//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 of Singleton звучит как противоречие. Цель singleton состоит в том, что у вас есть только один экземпляр класса. Создание массива кажется странным. – derpirscher

+0

Как я могу получить один экземпляр массива класса, разделяемого между несколькими классами? Это моя проблема. Класс в моем коде выше сокращен. Он содержит больше переменных (тип, ввод, вывод, комментарий и т. Д.) – ThymiosK

+0

Вам действительно нужно изучить объектно-ориентированное программирование. То, что вы написали, это God-Object Anti-Pattern –

ответ

0

одноплодный класс, который существует только один экземпляр (лично, при использовании C# Я предпочитаю статические классы вместо одиночек).

Для доступа к классу singleton вы используете Components.Instance. НО, в вашем случае, вы действительно не хотите синглтона.
Если вам нужен массив объектов Component, вы скорее захотите создать новый для каждого нового объекта в массиве, иначе массив будет бесполезен (если его точно такой же объект в нем ...).

Чтобы разделить переменную между несколькими экземплярами одного и того же класса, вы используете ключевое слово static, которое в основном делает его одним и тем же объектом по всем классам (если вы меняете его на единицу, оно изменяется во всех).
Таким образом, вы могли бы просто сделать ваш общий переменный класс статического класса:

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

И они будут достижимы, куда вы обращаетесь к классу SharedVariables.

Большие вопросы: хотя вам действительно нужен статический класс SharedVariables? Я подозреваю, что у вас есть проблема с дизайном, о которой нужно подумать.

+0

Дело в том, что у меня есть много переменных в моем классе SharedVariable. Должен ли я использовать ключевое слово static везде? Я думаю, что я видел нечто вроде статического конструктора для классов. Я не уверен. Существует ли такая вещь? – ThymiosK

+0

Существует статический конструктор yes. Вы можете сделать свой SharedVariables класс в singleton, если вы не хотите использовать все статические свойства, но лично я бы подумал о том, должен ли класс даже существовать, а переменные не должны размещаться в других классах и оставаться там приватными. Я не могу сказать ничего об этом, хотя, поскольку я не видел весь код: P – Jite

+0

Итак, в основном все, что вам нужно, чтобы ваш текущий код работал, - реализовать «singleton pattern» в классе «SharedVariables» вместо класса 'Компоненты', затем обращайтесь к нему через' SharedVariables.Instance.Property; 'вместо 'SharedVariables.Property'; – Jite

 Смежные вопросы

  • Нет связанных вопросов^_^