【问题标题】:getting around multiple inheritances in C#在 C# 中绕过多重继承
【发布时间】:2012-10-09 21:27:24
【问题描述】:

我在 C# 中创建一个表单,因此任何新表单都继承了类 From 中构建的属性 我还创建了一个名为 program 的类,它启动到我的数据库的连接我希望我的所有表单都继承它,因为我不想为每个表单打开一个新连接 我不能使用接口,因为程序包含 main() 它在其中创建连接 我的程序课是

      class Program
      {
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {

        MySqlConnection myConnection = new MySqlConnection("Server=instance2813231.db.xeround.com;Port=18422;Database=shares info;Uid=user;Pwd=password;");
        MySqlCommand command = myConnection.CreateCommand();

        try
        {

            myConnection.Open();
            MessageBox.Show("connected");


        }
        catch (Exception a)
        {
            Console.WriteLine(a.ToString());
            MessageBox.Show("Failed");
        }
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

我该如何解决这个问题?

【问题讨论】:

  • 您将 DB 代码与 UI 代码混合在一起。这本身就是一个很大的设计缺陷。
  • 这个问题需要一些改进:代码向我们展示了正在发生的事情,对于初学者。其次,这是一个相当广泛的问题,因为它会涉及到应用程序的适当设计。我不确定这里是否适用多重继承。如果是这样,那么这个问题已经被问了很多。
  • 我的连接不在我的视图中,但在 UI 中用户将添加数据以保存到数据库中,因此我必须在 UI 中编写将使用我的连接的 sql INSERT 语句
  • @AyaAbdelsalam - 诸如 INSERT 之类的 DB 代码应位于单独的代码段中。例如,在一个被所有 UI 元素调用的类中。

标签: c# multiple-inheritance


【解决方案1】:

我希望我的所有表单都继承它

哎呀,别这样。这是为了以非常糟糕的方式实现代码重用而滥用继承。

首先,尝试将您的 GUI 代码与数据库代码分开。

其次,支持组合而不是继承——表单在逻辑上不是Program 或“数据库连接打开器”。它应该使用后者,但它不是一个。你应该有一个入口点,它实例化它需要的任何东西,然后开始运行。

第三,不要在代码中使用单个连接,而是根据需要打开和关闭连接,让连接池处理效率方面的问题。

因此,不是从类派生,而是为每个表单提供对数据库连接打开器实例的引用(如果您真的想要混合使用您的数据库和 GUI 代码...... ick),然后你的表单就可以使用那个开瓶器了。

【讨论】:

  • 非常感谢,这很有帮助
  • 我在每个表单中都连接了许多表单,这会使我的应用程序非常慢,有没有办法解决这个问题?
  • @AyaAbdelsalam:什么会让你的应用程序变得很慢?您需要非常清楚您要解决的实际问题是什么 - 以及您是否真的遇到过这个问题,或者您是否预计它会成为一个问题。跨度>
  • 我正在访问云数据库,所以每次打开新表单时我都会打开一个连接,因此打开表单需要时间
  • @AyaAbdelsalam:不应该 - 如果您正确处理所有内容,连接池应该会处理这个问题。您应该在每次需要时打开和关闭连接。
【解决方案2】:

你不能有多重继承,你可以做的是有一个从System.Windows.Forms.Form继承的FormBase,然后让你的所有表单都从FormBase继承。

【讨论】:

    【解决方案3】:

    您不能在 C# 中进行多个类继承。但是,出于您的目的,您可以阅读connection pooling concept

    连接到数据源可能很耗时。为了最小化 打开连接的成本,ADO.NET 使用优化技术 称为连接池,它最大限度地减少重复的成本 打开和关闭连接。处理连接池 对于 .NET Framework 数据提供程序而言,情况有所不同。

    【讨论】:

      【解决方案4】:

      抱歉,您确实问错了问题。处理您所要求的适当方法不是通过多重继承,甚至不是 FormBase。您应该考虑使用Strongly Typed DataSetLINQ-to-SQLEntity Framework

      即使您使用的是原始 ADO.NET,也不应该以这种方式挂在数据库连接上。特别是如果有任何东西是多线程的,这将严重崩溃。

      不要在 main 中创建连接,而是在 app.config 中使用 ConnectionString setting 并根据需要在实际工作的地方打开和关闭连接。 connection pooling 底层 ADO.NET 将负责为您最大限度地减少建立和拆除连接的费用,并且不会因多线程而受到影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-17
        • 2017-03-31
        • 2012-05-14
        • 2013-08-28
        • 2011-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多