C# 函数C的全局开关#

C# 函数C的全局开关#,c#,if-statement,switch-statement,C#,If Statement,Switch Statement,我有这样的代码: public string ReadName(int ID) { if(db.Name == "mysql") return mysql.ReadName(ID); else if(db.Name == "oracle") return oracle.ReadName(ID); } 我有很多这样的功能。 是否有一种方法我不能在我的每个函数中重复if-else 谢谢你继承: 为数据库创建基类接口 为oracle和mysql创建数据

我有这样的代码:

  public string ReadName(int ID)
    {
       if(db.Name == "mysql") return mysql.ReadName(ID);
       else if(db.Name == "oracle") return oracle.ReadName(ID);
    }
我有很多这样的功能。 是否有一种方法我不能在我的每个函数中重复if-else

谢谢你

继承:

  • 为数据库创建基类接口
  • 为oracle和mysql创建数据库子类
  • 将数据库对象传递给构造函数
  • 调用database.ReadName(ID) 继承:

  • 为数据库创建基类接口
  • 为oracle和mysql创建数据库子类
  • 将数据库对象传递给构造函数
  • 调用database.ReadName(ID)
    您可以定义一个接口:

    public interface IMyDb
    {
        string ReadName(int ID);
    }
    
    然后让每个特定于数据库的类实现它:

    public class MySqlDb : IMyDb
    {
        public string ReadName(int ID)
        {
            // you have already written the code for this method
        }
    }
    
    然后,当应用程序初始化时,只有一个开关:

    IMyDb dbImpl;
    switch (db.Name)
    {
        case "mysql":
            dbImpl = new MySqlDb();
            break;
        case "oracle":
            ...
    }
    
    最后,您可以调用该方法,而不必担心在幕后使用哪个类:

    string name = dbImpl.ReadName(23);
    

    您可以定义一个接口:

    public interface IMyDb
    {
        string ReadName(int ID);
    }
    
    然后让每个特定于数据库的类实现它:

    public class MySqlDb : IMyDb
    {
        public string ReadName(int ID)
        {
            // you have already written the code for this method
        }
    }
    
    然后,当应用程序初始化时,只有一个开关:

    IMyDb dbImpl;
    switch (db.Name)
    {
        case "mysql":
            dbImpl = new MySqlDb();
            break;
        case "oracle":
            ...
    }
    
    最后,您可以调用该方法,而不必担心在幕后使用哪个类:

    string name = dbImpl.ReadName(23);
    

    **编辑:我在看到有人回答之前写了这个。。。不管怎样,这只是一个小片段的相同想法**

    首先,如果你不知道OOP好的方面,特别是继承,你就无法解决这个问题。如果oracle和mysql继承自相同的泛型类型(类或接口),则可以使用多态性。最好的选择是保留对正确db的引用,并在构造函数中初始化它

    public interface DbInterface {
    ... Generic method declaration
    }
    
    public class Mysql :db {
    ... Generic method implementation
    }
    
    public class Oracle :db {
    ... Generic method implementation
    }
    
    public class YourClass {
        private DbInterface _db;
    
        public YourClass(DbInterface db) {
           this._db = db;
        }
    }
    

    然后每次你使用_db时,你肯定知道它就是你想要的db。

    **编辑:我在看到有人回答之前写了这个。。。不管怎样,这只是一个小片段的相同想法**

    首先,如果你不知道OOP好的方面,特别是继承,你就无法解决这个问题。如果oracle和mysql继承自相同的泛型类型(类或接口),则可以使用多态性。最好的选择是保留对正确db的引用,并在构造函数中初始化它

    public interface DbInterface {
    ... Generic method declaration
    }
    
    public class Mysql :db {
    ... Generic method implementation
    }
    
    public class Oracle :db {
    ... Generic method implementation
    }
    
    public class YourClass {
        private DbInterface _db;
    
        public YourClass(DbInterface db) {
           this._db = db;
        }
    }
    

    然后每次你使用_db时,你肯定知道它就是你想要的db。

    我想是时候读一下关于继承的书了。。。。还有接口。我想你该读一下继承。。。。和接口。