在C#中绕过多个继承

时间:2012-10-09 21:27:25

标签: c# multiple-inheritance

我在c#中创建一个表单,所以任何新表单都继承了类From中的build属性 我还创建了一个名为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());
    }
}

我怎样才能解决这个问题?

4 个答案:

答案 0 :(得分:6)

  

我希望我的所有表格都能继承它

是的,不,不。为了以非常糟糕的方式实现代码重用,这是滥用继承。

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

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

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

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

答案 1 :(得分:1)

您不能拥有多重继承,您可以做的是FormBase继承自System.Windows.Forms.Form,然后让所有表单都继承自FormBase

答案 2 :(得分:0)

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

  

连接到数据源可能非常耗时。尽量减少   打开连接的成本,ADO.NET使用优化技术   称为连接池,可最大限度地降低重复成本   打开和关闭连接。处理连接池   不同的.NET Framework数据提供程序。

答案 3 :(得分:0)

抱歉,你真的在​​问这个错误的问题。处理你问的问题的适当方法不是通过多重继承甚至是FormBase。您应该考虑使用Strongly Typed DataSetLINQ-to-SQLEntity Framework

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

不要在main中创建连接,而是在app.config中使用ConnectionString setting,并根据需要打开和关闭实际工作的连接。 connection pooling底层ADO.NET将为您减少连接设置和拆除的费用,并且不会因多线程而受到破坏。