【问题标题】:Dynamically create multiple object instances of same class in c#在c#中动态创建同一类的多个对象实例
【发布时间】:2017-06-02 08:54:31
【问题描述】:

我正在用 C# 构建一个控制泵流量的设备控制器。有 Form1 和 Pump-Class,包含可以通过 Form 访问的泵的所有属性和方法。到目前为止,一切正常。但是,可能存在不止一个泵的情况。当然,我可以运行可执行文件的单个实例,但你知道..

如何根据我当前的需求创建泵类的多个实例。也许是一个带有添加按钮的额外表单,可以根据需要创建尽可能多的泵?

当然,这归结为一个非常基本的问题,但我不是专业程序员。任何 cmet 都非常感谢。

提前致谢。

穆尔姆

namespace PumpController
{

    public partial class Form1 : Form
    {

        static Pump pump;

        public Form1()
        {

            InitializeComponent();

            cb_availablePorts.DropDownStyle = ComboBoxStyle.DropDownList;
            cb_baudRates.DropDownStyle = ComboBoxStyle.DropDownList;

            string[] availablePorts = SerialPort.GetPortNames();
            foreach (string item in availablePorts)
                {
                    cb_availablePorts.Items.Add(item);
                }

            string[] commonBaudRates = new string[] { "4800", "9600", "19200", "38400", "57600", "115200" };
            foreach (string item in commonBaudRates)
            {
                cb_baudRates.Items.Add(item);
            }
        }

        private void bt_valueUp_Click(object sender, EventArgs e)
        {
            if (!(pump == null))
            {
                pump.increaseValue();
            }           
        }

        private void bt_valueDown_Click(object sender, EventArgs e)
        {
            if (!(pump == null))
            {
                pump.decreaseValue();
            }
        }

        private void Form_Closing(object sender, EventArgs e)
        {
            Hide();
            if (!(pump == null))
            {
                pump.Close();
            }                
        }

        private void bt_connect_Click(object sender, EventArgs e)
        {
            if (!(cb_availablePorts.SelectedItem == null) && !(cb_baudRates.SelectedItem == null))
            {
                Pump pump = new Pump(Convert.ToString(cb_availablePorts.SelectedItem), Convert.ToInt32(cb_baudRates.SelectedItem));
            }           
        }
    }
}

【问题讨论】:

  • static Pump pump; - 这意味着在整个应用程序中只有一个Pump 实例可用。您可以根据需要通过创建Pump 的对象来拥有多个Pumps(可能在单击添加泵按钮时)
  • 您可以使用List<Pump> 并在每次添加点击时将新项目添加到此列表中。
  • @kashi_rock 我考虑过创建一个列表,但不确定创建“个人”实例是否更好。
  • @ViVi 但是这样我就需要给对象单独命名,对吧...
  • @mulm :我以为你一次只有 1 个实例。如果您有多个实例,那么List<Pump> 是最佳选择

标签: c# winforms visual-studio serial-port


【解决方案1】:

cmets 得出了部分答案,并且在他们所进行的范围内都是正确的。然而,可能忽略了一件重要的事情——寻找(其他)COM 端口的部分。

每次实例化new Pump 对象并将其添加到List<Pump> 集合时,这些对象将争用同一个COM 端口,除非您分配另一个端口。

enumerating COM ports 有一个广为接受的答案。讨厌提供一个链接作为我的答案的核心,但如果你有一个 Pump 对象的四个对象列表竞争一个串行端口,你可能会遇到麻烦。

【讨论】:

  • 当然这是很重要的一点。根据我处理 COM 端口的经验,可能非常棘手。但是,我稍微缩短了代码。最终的项目将有一些逻辑来检查这种冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2020-05-11
  • 2013-10-20
  • 1970-01-01
  • 2018-06-27
  • 2014-05-24
  • 1970-01-01
相关资源
最近更新 更多