我必须解决每个传感器类型需要不同计算的问题(我需要决定在运行时实例化哪种类型)。 让我以一个例子告诉你:
1。从数据库表中我得到了这个结果:
SensorType RawValue ADCGain R0Value I0Value ABCValue
1 100 0.1 NULL NULL NULL
1 150 0.2 NULL NULL NULL
2 30 NULL 1 2 2
2 15 NULL 5 5 6
假设传感器类型1是具体类型 AISensor ,并且来自基类的类型和类型2是 Pt100Tempsensor 并且来自同一基类的inhertis。 这是C#中的类定义:
public abstract class Sensor
{
public abstract int Id { get; set; }
public abstract string Code { get; set; }
public abstract string Name { get; set; }
public abstract double GetCalculatedValue(int rawValue);
}
public class Pt100Tempsensor : Sensor
{
public int R0Value { get; set; }
public int I0value { get; set; }
public int ABCValue { get; set; }
public override int Id { get; set; }
public override string Code { get; set; }
public override string Name { get; set; }
public override double GetCalculatedValue(int rawValue)
{
return ((R0Value * I0value) / ABCValue) * rawValue;
}
}
public class AISensor : Sensor
{
public int AdcGain { get; set; }
public override int Id { get; set; }
public override string Code { get; set; }
public override string Name { get; set; }
public override double GetCalculatedValue(int rawValue)
{
return rawValue * AdcGain;
}
}
现在我想知道在运行时实例化对象的最佳方法是什么,如果我添加新的传感器类型,我不需要更改现有代码(如简单的工厂方法"模式"。)
感谢您的帮助。
答案 0 :(得分:0)
使用根据传感器类型ID
创建具体传感器的工厂答案 1 :(得分:0)
最简单的方法是使用基于ID的开关的工厂方法,根据ID号制作不同的传感器。
如果您希望能够在不更改任何其他代码的情况下添加传感器(即无需更改工厂方法),则需要使用反射来(1)发现所有可用的传感器类型,以及(2)构建正确的传感器类型它的ID。你可以这样用一个属性,例如:
[Sensor(42)]
public class Pt100Tempsensor : Sensor
{
....
其中42是ID
但说实话,如果您真的需要大量的传感器类型,那么这样做是值得的。
答案 2 :(得分:0)
我提出了一个简单工厂模式的建议。
但是:如果你真的需要添加新传感器而不涉及现有代码,我只能想到一个"插件系统"。这意味着:
供参考:Microsoft有一些示例代码。见https://code.msdn.microsoft.com/windowsdesktop/Creating-a-simple-plugin-b6174b62
答案 3 :(得分:0)
您可以使用ORM(实体框架,NHibernate)来实现此目标。创建新的Sensor类时,必须修改代码,但仅限于数据库映射部分。
该表看起来像一个具有TPH映射策略的表,其中SensorType是鉴别器列。