两个类,相同的方法,一个对象?

时间:2014-04-02 09:18:06

标签: c#

我正在开发一个使用Oracle" Siebel CRM"的C#项目。产品。 Siebel提供了两个名称空间和类,用于以编程方式连接到它的服务,具体取决于您是要连接到服务器还是连接到客户端会话:

SiebelBusObjectInterfaces.SiebelDataControl
TWSiebelLib.SiebelWebApplication

SiebelDataControl公开了一种显式登录基于服务器的资源的特定方法:

bool SiebelDataControl.Login(string connString, string userName, string passWord)

所有其他方法在两个类之间是相同的。

我目前正在维护我的两个版本的应用程序 - 每个版本对应一个不同的连接类。随着我构建的功能越来越具有包容性和复杂性,单独维护这两个应用程序变得非常困难。我已将连接部分拆分为自己的类,但在开发时我仍然需要在应用程序之间复制和粘贴代码。

理想情况下,我想要一个VS解决方案,它包含我所有自定义代码的一个实例和一些逻辑,用于确定用户决定使用哪两个连接类。

理论上,我想要类似的东西:

class SiebelAppWrapper {

    public Object m_SiebelAppInstance;
    private Boolean m_isConnected;
    private short m_conType;

    public static short SERVER_CON = 1;
    public static short CLIENT_CON = 2;

    public SiebelAppWrapper(short conType) {
        if (conType == SERVER_CON) {
            m_SiebelAppInstance = new SiebelDataControl();
          } else if conType == CLIENT_CON {
            m_SiebelAppInstance = new SiebelWebApplication();
        } 
        m_conType = conType;
    }
}

但是,由于显而易见的原因,编译器对此并不满意。

我对C#和.NET开发一般都很陌生,所以我希望有一些方法可以在不复制所有dependend代码的情况下合并这两个类。

非常感谢您的任何帮助。

2 个答案:

答案 0 :(得分:11)

从你的描述听起来一个可行的选择是:

  1. 创建一个界面ISiebelWhatever,描述您将要使用的两个类之间的所有常用功能。
  2. 从每个源类中派生两种类型,并使这些新类型实现ISiebelWhatever
  3. 使用ISiebelWhatever作为m_SiebelAppInstance
  4. 的类型

    当然,这只有在源类不是sealed时才有效,并且对签名不相同的方法没有帮助。此外,通用接口方法有点明显,这引出了一个问题:源库是否已经有可能实现这一点?或者这两个班级有共同的基础?你应该先检查一下。

    如果有两个类之间没有共享但你需要使用的方法,那么你还需要决定一个共同的签名(在ISiebelWhatever中声明)并让你的两个子类通过适当地转发到他们现有的非共享方法。

答案 1 :(得分:3)

如果您有很多共同的方法,为什么不使用继承或接口?