打开不同的方法,但使用相同的名称-C#

打开不同的方法,但使用相同的名称-C#,c#,php,mysql,sql-server,methods,C#,Php,Mysql,Sql Server,Methods,我意识到这个标题可能会让人很困惑,所以为了解释我想做什么,我将演示如何用PHP轻松解决同样的问题 例如,我给应用程序的用户一个选择数据库类型(即MySQL、MSSQL等) 在我的代码中,我希望每个操作只有一个函数,而不是像下面解释的那样每个数据库都有一个函数 不是 main.php 上面提到的最大问题是,我不能在方法(函数)周围放一个if子句,然后我必须面对每个数据库类型所特有的类型问题,其中包括我必须在与数据库函数相关的每个方法中包含返回的连接变量 那么,关于如何修复此问题并使其像上面的PHP

我意识到这个标题可能会让人很困惑,所以为了解释我想做什么,我将演示如何用PHP轻松解决同样的问题

例如,我给应用程序的用户一个选择数据库类型(即MySQL、MSSQL等)

在我的代码中,我希望每个操作只有一个函数,而不是像下面解释的那样每个数据库都有一个函数

不是

main.php

上面提到的最大问题是,我不能在方法(函数)周围放一个if子句,然后我必须面对每个数据库类型所特有的类型问题,其中包括我必须在与数据库函数相关的每个方法中包含返回的连接变量

那么,关于如何修复此问题并使其像上面的PHP示例一样工作,您有什么想法吗?我既不是C#方面的专家,也不是新手,但我学得很快。

你会想研究“接口”或“代理”

接口在各种语言(包括C#和Java)中更为常见,允许您提供不同的实现(通过实现类),这些实现共享相同的接口,并且可以互换使用

委托也是一个相当酷的选择,但仅限于一种方法——这可能就是您在这里寻找的方法。(与接口相比,接口定义了作为接口一部分存在的一个或多个方法)

其他一些参考资料:

  • 接口(C#编程指南):
  • 学员教程:
  • 何时使用委托而不是接口(C#编程指南):
您需要研究“接口”或“代理”

接口在各种语言(包括C#和Java)中更为常见,允许您提供不同的实现(通过实现类),这些实现共享相同的接口,并且可以互换使用

委托也是一个相当酷的选择,但仅限于一种方法——这可能就是您在这里寻找的方法。(与接口相比,接口定义了作为接口一部分存在的一个或多个方法)

其他一些参考资料:

  • 接口(C#编程指南):
  • 学员教程:
  • 何时使用委托而不是接口(C#编程指南):

    • 也许您可以选择工厂方法或策略来实现这一点。基本上,您可以为工作创建一个界面:

      public interface ConnectionFactory {
          IDBConnection CreateConnection(string connectionString);
      }
      

      然后根据
      类型给它们不同的实现

      也许您可以选择工厂方法或策略来实现这一点。基本上,您可以为工作创建一个界面:

      public interface ConnectionFactory {
          IDBConnection CreateConnection(string connectionString);
      }
      

      然后根据
      类型

      给它们不同的实现。我个人认为,您需要以不同的方式处理问题。这就是面向对象编程的优势所在。基本上,您将抽象出特定于数据库的内容,以便调用代码不知道它正在使用哪个数据库。如果您是从头开始做的,下面是一个过于简化的示例:

      public interface IDatabase {
         void Connect(string ...);
         string Query(string ...);
      }
      
      public class MySQLDB : IDatabase {
         void Connect(string ...){
             MySqlConnection connection = new MySqlConnection(connectionString);
             ...
         }
      
          // same for query, etc
      }
      
      public class OracleDB : IDatabase {
         void Connect(string ...){
             // connect using Oracle library
             ...
         }
      
          // same for query, etc
      }
      
      因此,在客户端代码中,您可以选择要实例化的数据库类型,然后调用相同的函数,而不管它是什么类型:

      IDatabase db;
      if (dbtype == "mysql")
         db = new MySqlDB();
      else if (dbtype == "oracle")
         db = new OracleDB();
      
      db.Connect(...);
      ...
      

      就个人而言,我认为你需要以不同的方式处理这个问题。这就是面向对象编程的优势所在。基本上,您将抽象出特定于数据库的内容,以便调用代码不知道它正在使用哪个数据库。如果您是从头开始做的,下面是一个过于简化的示例:

      public interface IDatabase {
         void Connect(string ...);
         string Query(string ...);
      }
      
      public class MySQLDB : IDatabase {
         void Connect(string ...){
             MySqlConnection connection = new MySqlConnection(connectionString);
             ...
         }
      
          // same for query, etc
      }
      
      public class OracleDB : IDatabase {
         void Connect(string ...){
             // connect using Oracle library
             ...
         }
      
          // same for query, etc
      }
      
      因此,在客户端代码中,您可以选择要实例化的数据库类型,然后调用相同的函数,而不管它是什么类型:

      IDatabase db;
      if (dbtype == "mysql")
         db = new MySqlDB();
      else if (dbtype == "oracle")
         db = new OracleDB();
      
      db.Connect(...);
      ...
      
      public interface ConnectionFactory {
          IDBConnection CreateConnection(string connectionString);
      }
      
      public interface IDatabase {
         void Connect(string ...);
         string Query(string ...);
      }
      
      public class MySQLDB : IDatabase {
         void Connect(string ...){
             MySqlConnection connection = new MySqlConnection(connectionString);
             ...
         }
      
          // same for query, etc
      }
      
      public class OracleDB : IDatabase {
         void Connect(string ...){
             // connect using Oracle library
             ...
         }
      
          // same for query, etc
      }
      
      IDatabase db;
      if (dbtype == "mysql")
         db = new MySqlDB();
      else if (dbtype == "oracle")
         db = new OracleDB();
      
      db.Connect(...);
      ...