Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改已初始化变量的类_C# - Fatal编程技术网

C# 更改已初始化变量的类

C# 更改已初始化变量的类,c#,C#,出于测试目的,我希望能够更改绑定到变量传感器的类。通常,程序将使用传感器通过传感器类测量的数据。但是,如果没有连接传感器,我可以使用SensorSimulator类模拟其行为 我现在做的是注释掉我不想使用的类。如何使其工作,以便通过单击GUI中的按钮,我可以在传感器和传感器模拟器类之间切换?或者有没有其他方法可以做到这一点 代码 创建接口IsSensor,并让Sensor和SensorSimulator实现它。就这样 延伸回答: public interface ISensor { Se

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

我现在做的是注释掉我不想使用的类。如何使其工作,以便通过单击GUI中的按钮,我可以在
传感器
传感器模拟器
类之间切换?或者有没有其他方法可以做到这一点

代码
创建接口IsSensor,并让Sensor和SensorSimulator实现它。就这样

延伸回答:

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中的代码。此主机保留IsSensor类型的属性传感器。因此,您可以将其设置为实现此接口的任何对象。第一次调用Measure()将使用实际传感器。第二个调用将在SensorSimulator上调用。它被称为多态性。

创建接口ISensor,并让Sensor和SensorSimulator实现它。就这样

延伸回答:

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中的代码。此主机保留IsSensor类型的属性传感器。因此,您可以将其设置为实现此接口的任何对象。第一次调用Measure()将使用实际传感器。第二个调用将在SensorSimulator上调用。它被称为多态性。

使用接口定义类

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

使用接口定义类

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

尽管创建公共接口通常是可取的,但您不必对现有代码做任何操作,只要将
sensor
声明为基类类型
sensor
,并且不希望使用任何
SensorSimulator
特定的方法,就可以在运行时切换类型:

private Sensor sensor;

private void Form1_Load(object sender, EventArgs e)
{
    sensor = new Sensor();           
    var data = sensor.getData();
    sensor.stopMeasuing();
}    

private void button1_Click(object sender, EventArgs e)
{
    // Detect the type of `sensor` and switch it
    if (sensor is SensorSimulator) sensor = new Sensor();
    else sensor = new SensorSimulator();
}

尽管创建公共接口通常是可取的,但您不必对现有代码做任何操作,只要将
sensor
声明为基类类型
sensor
,并且不希望使用任何
SensorSimulator
特定的方法,就可以在运行时切换类型:

private Sensor sensor;

private void Form1_Load(object sender, EventArgs e)
{
    sensor = new Sensor();           
    var data = sensor.getData();
    sensor.stopMeasuing();
}    

private void button1_Click(object sender, EventArgs e)
{
    // Detect the type of `sensor` and switch it
    if (sensor is SensorSimulator) sensor = new Sensor();
    else sensor = new SensorSimulator();
}


只是为了确保->变量的类型为ISensor,这样您就可以在它们已经实现相同的基类型时随时切换实现。接口是如何改变的?你能提供一个如何改变的例子吗?@Roald我建议你研究一下依赖注入。您描述的按钮行为可以通过更改DI配置来实现(当使用interface
IsSensor
use class
SensorSimulator
时),这样您的所有应用程序都将以一致的方式运行。另外。。。在代码中实现接口可以很容易地将单元测试添加到代码中。只需确保->变量的类型为ISensor,这样您就可以在它们已经实现相同的基本类型时随时切换实现。接口是如何改变的?你能提供一个如何改变的例子吗?@Roald我建议你研究一下依赖注入。您描述的按钮行为可以通过更改DI配置来实现(当使用interface
IsSensor
use class
SensorSimulator
时),这样您的所有应用程序都将以一致的方式运行。另外。。。在代码中实现接口可以很容易地向代码中添加单元测试。在这种情况下,
SensorSimulator
是否仍然能够从
Sensor
继承方法?是的,您可以直接从Sensor继承方法,但是GetData必须是虚拟的,以便您能够覆盖它。在这种情况下,
SensorSimulator
是否仍然能够从
Sensor
继承方法?是的,您可以直接从Sensor继承方法,但是GetData必须是虚拟的才能覆盖它。这是依赖项注入的一个很好的用例这是依赖项注入的一个很好的用例不幸的是,我使用了
SensorSimulator
特定的方法。哦,好的。所以现在你做的不仅仅是注释掉你不想使用的类,然后…结果是我有一段时间没有使用
Sensor
类,同时我添加了一个
SensorSimulator
特定方法。啊,明白了。如果需要调用该方法,那么这将不起作用。我有另一个想法,我很快就会发布。不幸的是,我使用了
SensorSimulator
特定的方法。哦,好的。所以现在你做的不仅仅是注释掉你不想使用的类,然后…结果是我有一段时间没有使用
Sensor
类,同时我添加了一个
SensorSimulator
特定方法。啊,明白了。如果需要调用该方法,那么这将不起作用。我有另一个想法,也将工作,我将张贴不久。