我正在使用代码来实现硬件测试系统,该系统涉及与几个台式仪器的通信。当我实例化其中一个仪器的实例时,构造函数尝试打开与仪器的通信会话。如果失败了,我可以抛出各种错误,但我想做的是让仪器对象默认为虚拟或模拟模式,在这种模式下没有进行实际的通信,但我仍然可以运行我的代码。 / p>
现在我拥有一种继承自基类的一种类型的乐器。我已经在基类中添加了虚拟方法来执行这些调试功能,但是在通信会话失败时,我在创建时坚持修改派生对象以实现基类方法。 / p>
理想的解决方案是让构造函数(技术上是new关键字)返回基类的实例而不是派生类,但是我已经做了相当多的搜索但是没有似乎是可能的。
我可以将一个属性添加到派生类中以用作布尔标志,其中派生类中的每个方法都对该标志进行测试并调用基类方法(如果为true),但我希望找到更优雅的解决方案不需要几百个if语句和严重的base.Stuff()调用。
我有几十种方法和一些以这种方式继承的工具,所以一个不需要对这些重写方法中的每一个进行显式更改的解决方案将会有很长的路要走。
public abstract class BaseInstrument
{
public string Address;
protected MessageBasedSession MbSession;
public virtual string Identify()
{
return "Debugging mode, fake identity";
}
}
public class SpecificInstrument : BaseInstrument
{
public SpecificInstrument(string address)
{
Address = address;
try
{
MbSession = (MessageBasedSession)ResourceManager.GetLocalManager().Open(Address);
}
catch
{
// Return an object modified in such a way that it invokes base class virtual methods
// instead of method overrides.
// Constructor has no return value (that comes from the new keyword) so I can't
// just return an instance of the base class...
}
}
public override string Identify()
{
return ActualInstrumentRead();
}
// ...
}
public class Program
{
public static void Main()
{
SpecificInstrument instr = new SpecificInstrument(ipAddress);
Console.WriteLine(instr.Identify()); // Would like to print the debug case if eg. my LAN is down
}
}
我觉得我可能错过了一个明显的解决方案,但我已经摸不着头几个小时了。
答案 0 :(得分:0)
您无法从BaseInstrument
构造函数返回SpecificInstrument
。
另一种方法是将此逻辑放在创建此工具的位置:
BaseInstrument instrument;
try {
instrument = new SpecificInstrument();
}
catch {
instrument = new BaseInstrument();
}