首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数的全局开关C#

问函数的全局开关C#
EN

Stack Overflow用户
提问于 2017-05-15 22:51:18
回答 3查看 77关注 0票数 0

我的代码是这样的:

代码语言:javascript
复制
  public string ReadName(int ID)
    {
       if(db.Name == "mysql") return mysql.ReadName(ID);
       else if(db.Name == "oracle") return oracle.ReadName(ID);
    }

我有很多这样的函数。有没有一种方法可以让我不必在每个函数中重复if-else?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2017-05-15 22:58:35

您可以定义一个接口:

代码语言:javascript
复制
public interface IMyDb
{
    string ReadName(int ID);
}

然后让每个特定于数据库的类实现它:

代码语言:javascript
复制
public class MySqlDb : IMyDb
{
    public string ReadName(int ID)
    {
        // you have already written the code for this method
    }
}

然后,当您的应用程序初始化时,您只有一个开关:

代码语言:javascript
复制
IMyDb dbImpl;
switch (db.Name)
{
    case "mysql":
        dbImpl = new MySqlDb();
        break;
    case "oracle":
        ...
}

最后,您可以调用该方法,而不必担心您在幕后使用的是哪个类:

代码语言:javascript
复制
string name = dbImpl.ReadName(23);
票数 4
EN

Stack Overflow用户

发布于 2017-05-15 22:57:42

继承:

  1. 为constructor
  2. call database.ReadName(ID);

创建基类接口oracle数据库和mysql

  • 将数据库对象传递给oracle
票数 0
EN

Stack Overflow用户

发布于 2017-05-15 23:03:15

**编辑:我在看到有人回复之前写了这篇文章...无论如何,这只是小片段的相同想法**

首先,如果你不了解OOP的优点和继承,你就不能解决这个问题。如果oracle和mysql继承自相同的泛型类型(类或接口),则可以只使用多态性。最好的选择是保留对正确数据库的引用,并在构造函数中对其进行初始化。

代码语言:javascript
复制
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时,您肯定知道它就是您想要的数据库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43982548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档