更改已初始化的变量的类

时间:2018-03-01 11:01:04

标签: c#

出于测试目的,我希望能够更改哪个类绑定到变量sensor。通常,程序将使用传感器通过Sensor类测量的数据。但是,如果没有连接传感器,我可以使用SensorSimulator类来模拟其行为。

我目前所做的是评论我不想使用的课程。如何使其工作,只需单击GUI中的按钮,我就可以在SensorSensorSimulator类之间切换?或者有替代方法吗?

代码

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;
        }
    }
}

3 个答案:

答案 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();