最好在应用程序中使用抽象覆盖类

时间:2014-05-23 04:32:54

标签: c# oop design-patterns

假设我有一个抽象类,例如DatabaseConnection包含3个抽象方法OpenconnectionExecutequerycloseconnection 这个DatabaseConnection类是由不同的类继承来与mysql,oracle,sql server建立连接的...那么继承clasess的结构怎么样?
什么是创建派生类实例的最佳方法,它提高了代码的可维护性和可重用性?

3 个答案:

答案 0 :(得分:3)

如果你有一个抽象类:

public abstract class DatabaseConnection
{
   public DatabaseConnection(...) // Optional if you want a base constructor
                                     with or without required parameters.
   public abstract void OpenConnection();
   ...
}

然后实现必须覆盖所有内容:

public class SQLServerDatabaseConnection : DatabaseConnection
{
   public SQLServerDatabaseConnection(...) //Whatever params you want
   //Or public SQLServerDatabaseConnection(...) : base (...) //if base has required params
   {
   }

   public override void OpenConnection()
   {
   }

   ...//Overrides for every other pure virtual method
}

答案 1 :(得分:1)

首先为类创建一个接口。实现接口的类在被接口引用时比在代码中的任何地方直接引用时更容易替换。接口有助于使代码更易于维护。

其次,使用注入框架来创建数据库类的实例。

例如NInject .. 在您的应用程序中的某一点将接口绑定到所需的实现...

Bind<IDatabaseConnection>.To<MySqlConnection>();

在您的应用中的某个位置创建实例...

// Creates an instance of the class bound 
IDatabaseConnection connection = _kernel.Get<IDatabaseConnection>(); 

答案 2 :(得分:1)

您尝试实现的内容与已在ADO.NET中实现的数据提供程序模型非常相似。您可以在System.Data.Common命名空间中以DbCommand,DbDataAdapter,DbDataReader等形式提供抽象层。您的数据访问层(DAL)可以以与数据提供者无关的方式编写,这意味着您正在使用工厂来实例化实现通用/抽象类和/或接口的实际数据提供程序类型。在ADO中,工厂知道使用提供的连接字符串的dataProvider属性实例化哪个提供程序。 http://www.devx.com/dotnet/Article/27297