出于测试目的,我希望能够更改哪个类绑定到变量sensor
。通常,程序将使用传感器通过Sensor
类测量的数据。但是,如果没有连接传感器,我可以使用SensorSimulator
类来模拟其行为。
我目前所做的是评论我不想使用的课程。如何使其工作,只需单击GUI中的按钮,我就可以在Sensor
和SensorSimulator
类之间切换?或者有替代方法吗?
using System.Windows.Forms;
namespace SO_question
{
public partial class Form1 : Form
{
//private Sensor sensor;
private SensorSimulator sensor;
public Form1()
{
InitializeComponent();
//sensor = new Sensor();
sensor = new SensorSimulator();
var data = sensor.getData();
sensor.stopMeasuing();
}
}
class Sensor
{
public virtual int getData()
{
return 0;
}
public void stopMeasuing() { }
}
class SensorSimulator : Sensor
{
public override int getData()
{
return 1;
}
}
}
答案 0 :(得分:3)
创建接口ISensor,让Sensor和SensorSimulator实现它。多数民众赞成。
EXTENDEND ANSWER:
public interface ISensor
{
SensorData GetData();
}
public class SensorData
{
}
public class Sensor : ISensor
{
public SensorData GetData()
{
return new SensorData();
}
}
public class SensorSimulator : ISensor
{
public SensorData GetData()
{
return new SensorData();
}
}
public class SensorHost
{
public ISensor Sensor { get; set; }
public void Measure()
{
Console.WriteLine(Sensor.GetData());
}
}
public static class Program
{
static void Main(string[] args)
{
SensorHost host = new SensorHost();
host.Sensor = new Sensor();
// measures by real sensor
host.Measure();
host.Sensor = new SensorSimulator();
// measures by sensor simulator
host.Measure();
}
}
在这里你可以看到这个想法。程序将创建SensorHost~您在Form1中拥有的代码。该主机保留ISensor类型的属性Sensor。因此,您可以将其设置为实现此接口的任何内容。第一次调用Measure()将使用真正的传感器。第二个调用将在SensorSimulator上调用。它被称为多态性。
答案 1 :(得分:2)
虽然通常更喜欢创建一个通用界面,但是你不能拥有来对现有代码做任何事情,只要你声明{{{}就可以在运行时切换类型。 1}}作为基类类型sensor
,并且不要使用任何Sensor
特定方法:
SensorSimulator
答案 2 :(得分:1)
使用界面来定义类。
public interface ISensor
{
int GetData();
void StopProcessing();
}
public class Sensor : ISensor
{
public int GetData()
{
return 0;
}
public void StopProcessing()
{
//throw new NotImplementedException();
}
}
public class SensorSimulator : ISensor
{
public int GetData()
{
return 1;
}
public void StopProcessing()
{
//throw new NotImplementedException();
}
}
然后你可以这样做
ISensor sensor;
sensor = new Sensor();
sensor = new SensorSimulator();