我正在开发一个使用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代码的情况下合并这两个类。
非常感谢您的任何帮助。
答案 0 :(得分:11)
从你的描述听起来一个可行的选择是:
ISiebelWhatever
,描述您将要使用的两个类之间的所有常用功能。ISiebelWhatever
。ISiebelWhatever
作为m_SiebelAppInstance
。当然,这只有在源类不是sealed
时才有效,并且对签名不相同的方法没有帮助。此外,通用接口方法有点明显,这引出了一个问题:源库是否已经有可能实现这一点?或者这两个班级有共同的基础?你应该先检查一下。
如果有两个类之间没有共享但你需要使用的方法,那么你还需要决定一个共同的签名(在ISiebelWhatever
中声明)并让你的两个子类通过适当地转发到他们现有的非共享方法。
答案 1 :(得分:3)
如果您有很多共同的方法,为什么不使用继承或接口?