在多个表单之间共享一个类

时间:2012-04-25 23:06:27

标签: c# winforms

我需要帮助解决这个问题。我已经尝试过搜索,我想我可能已经找到了使用Singleton Design模式的解决方案,但是想要确定。

我有一个Windows表单应用程序,我用Visual C#编写。我正在编写一个SerialPort类,因此可以通过所有表单共享(我不需要多个串口实例)。这是为了将逻辑与GUI分开。所有表单都可以对SerialPort类进行各种更改,如波特率,写入,读取等。

实施此解决方案的最佳方法是什么?我是OOP的新手,所以关于读数的任何建议都会很棒。

3 个答案:

答案 0 :(得分:3)

正如您已经说过的,可以使用Singleton设计模式解决此问题。这是一个小样本:

public class MySingleton() {
    private static MySingleton instance = new MySingleton();

    //your attributes go here...
    private MySingleton() {
    //your logic goes here...
    }

    public static MySingleton getInstance() {
        return instance;
    }
}

请注意,如果您的静态实例将用于多个线程,则您的类应锁定共享资源。我将提及Thread Safe Code

答案 1 :(得分:1)

@ Luiggi解决方案的替代方案,这里有一点线索良心:

public sealed class SerialPort
{
  private static volatile SerialPort instance;
  private static object threadLock = new Object();

  /// <summary>Retrieve an instance of SerialPort</summary>
  public static SerialPort Instance
  {
    get
    {
      if (SerialPort.instance == null)
      {
        lock (SerialPort.threadLock)
        {
          if (SerialPort.instance == null)
          {
            SerialPort.instance == new Serialport();
          }
        }
      }
      return SerialPort.instance;
    }
  }

  private SerialPort(){}
}

然后,在实践中:

SerialPort sp = SerialPort.Instance;
sp.MyMethod(...);

有关this Singleton pattern的更多信息。

答案 2 :(得分:1)

实际上,我昨天遇到了同样的问题,我想我可能已经找到了一种更简单的方法来处理这个问题,而不是使用单例方法。我创建了一个类文件,并创建了一个名为public class Serial的类。在里面我将我的序列变量声明为static SerialPort(即static SerialPort serial);与计时器相同,如果你需要使用一个。为set创建一个函数并调用serialStatus,它设置public static bool。我真的想在这里发布我的代码,但我真的不明白如何正确地做到这一点。在您的表单中,您将有第一个表单启动串行端口。对于另一种形式,你所要做的就是声明Serial serial = new Serial();拉出方法,你就可以了。如果您需要更改串行设置,可以使用bool输入创建一个方法(即trueserial.Close();然后使用新设置重新启动串行。