【发布时间】:2014-08-10 09:34:47
【问题描述】:
我正在重构一些源代码,并获得了一项删除预处理器编译的任务。我现在已经在互联网上搜索了几天,但还没有找到任何好主意。我对 C# 也很陌生。
所以问题来了,我对每个设备都有不同的接口(类),“ControlLogic”类当时只需要使用其中一个。在程序运行时选择设备。 到目前为止,很多地方都使用了“设备”变量(也全局使用),并且考虑重命名对我来说没有意义。此外,所有设备接口(类)都派生自基类,但接口类确实为它们实现了不同的方法。
public class ControlLogic
{
#if FIRST_DEVICE
public FirstDeviceInterace device = null;
#elif SECOND_DEVICE
public SecondDeviceInterface device = null;
#elif THIRD_DEVICE
public ThirdDeviceInterface device = null;
#endif
// One example method
public void startDevice()
{
if (device != null)
{
#if (FIRST_DEVICE || SECOND_DEVICE)
device.startDevice();
#endif
#if THIRD_DEVICE
device.startThirdDevice();
#endif
}
}
// More code.....
}
那么去除预处理器编译的最佳方法是什么?
【问题讨论】:
-
您能告诉我们关于
FirstDeviceInterace和其他人的哪些信息?您可以更改该代码吗? -
您有一个旨在与某些特定设备一起使用的程序,并在编译时做出决定。如果要删除编译时分支,请使程序足够智能以在运行时识别设备类型,以便同一程序可以与任何受支持的设备一起使用。您可以保留类成员变量,例如设备类型,而不是编译时常量。
-
你应该从一个抽象基类开始,找到共性。 StartDevice() 已经是你的第一个虚拟方法,当然还有更多。
-
是的,我可以更改 FirstDeviceInterface 和其他接口。实际上,该设备在运行时被识别,我有可用于此的全局变量。但问题是我如何根据它选择特定的设备接口(类)?
标签: c# c-preprocessor