可以';t在没有构造函数定义错误的情况下创建伪C#传感器类
本文关键字:情况下 错误 创建 传感器 定义 构造函数 可以 | 更新日期: 2023-09-27 18:00:06
我有一个C#Windows Phone 8应用程序,对于拥有该应用程序的手机,它将指南针传感器用于特定功能。我想修改这个类,这样它就可以在没有指南针传感器的手机上工作。我不想在if(_Compass!=null)语句中包装对Compass对象的每次调用。我想我可以为Compass方法和属性创建一个带有存根的伪Compass类,如果手机没有指南针,我可以创建它的实例而不是Compass,但我遇到了Compass类的抽象基类SensorBase的问题。无论我做什么,我都会得到编译时的错误:
Error 1 The type 'Microsoft.Devices.Sensors.SensorBase<TSensorReading>' has no constructors defined
我试图模拟的Compass类可以从SensorBase继承而不会出现此错误。我从Sensors元数据文件中获取了Compass类的确切声明行,并在将类名更改为CompassDumm后将其插入到我的伪类中,但我仍然收到错误。
我的猜测是Compass类可以从SensorBase继承,而我的伪类不能,因为它与SensorBase在同一个Assembly中。也许SensorBase的构造函数被标记为内部,或者涉及其他类似"朋友"的关系。
我的问题是,在这种情况下,我能做些什么来继承SensorBase而不出现这个错误吗?如果没有,是否还有另一种涉及依赖注入(IOC)的解决方案可以帮助实现我在手机没有指南针时实例化虚拟类的目标?
以下是我为CompassDummy类编写的代码,该类会出现错误:
public sealed class CompassDummy : SensorBase<CompassReading>
{
public CompassDummy()
{
}
} // public class CompassDummy
我的猜测是Compass类可以从SensorBase继承,而我的伪类不能,因为它与SensorBase在同一个Assembly中。也许SensorBase的构造函数标记为内部
正确。您不应该自己从SensorBase<T>
派生:它只是Accelerometer
、Compass
、Gyroscope
和Motion
的基类。
您是否打算在自己的代码中只使用这个伪Sensor
类,而不将其传递到任何地方?如果是这样的话,在这里使用组合而不是继承:
public interface ICompass
{
void Start();
// Whatever other methods you need
}
public class RealCompass : ICompass
{
private readonly Compass compass;
public RealCompass(Compass compass)
{
this.compass = compass;
}
public void Start()
{
this.compass.Start();
}
}
public class StubCompass : ICompass
{
public void Start()
{
// Do nothing...
}
}
然后,在您的代码中,使用ICompass
接口。
如canton7所建议的那样,使用一个允许替换具体指南针类型的接口是解决这个问题的好方法。根据您的需要,另一个需要考虑的解决方案是代理模式。
基本上,您将创建一个CompassProxy
类,在整个代码中使用该类。该类将具有与框架Compass
类类似或相同的方法/属性,并且它的每个实例将包含Compass
或CompassDummy
的相应实例,具体取决于手机的硬件。
对代理类的调用将被转发到包含的"后端"compass类,该类将完成真正的工作,然后任何结果都将传递回调用者。
举个例子,这里是CompassProxy类的一些原型代码:
class CompassProxy {
private readonly Compass _realCompass = null;
private readonly CompassDummy _dummyCompass = null;
private readonly bool _hasCompass = false;
public CompassProxy() {
// the creation logic could be moved out of this class, if need be
if ( HasRealCompassHardware() ) {
_realCompass = Compass.GetDefault(); // ...or whatever is the proper way to obtain an instance
_hasCompass = true;
} else {
_dummyCompass = new CompassDummy();
}
}
public CompassReading GetCurrentReading() {
return _hasCompass ? _realCompass.GetCurrentReading() : _dummyCompass.GetCurrentReading();
}
}