Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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#_Oop - Fatal编程技术网

C# 使用工厂按名称调用方法-最佳实践解决方案是什么

C# 使用工厂按名称调用方法-最佳实践解决方案是什么,c#,oop,C#,Oop,我想为家庭自动化项目找到最好的设计方案 我拥有以下实体: //Switch light on/off ISwitchable { Switch() } IDevice { } Lamp : IDevice, ISwitchable { Switch() } 如果我收到用户的输入以打开指示灯,我希望调用以下命令: 灯开关(…) 其中开关为字符串输入 我将使用工厂方法选择特定的设备(灯),但具体的功能如何 调用desire方法(如果存在)的最佳实践是什么。 反射是一种方式,

我想为家庭自动化项目找到最好的设计方案

我拥有以下实体:

//Switch light on/off
ISwitchable
{
    Switch()
}  

IDevice
{
}

Lamp : IDevice, ISwitchable
{
    Switch()
}
如果我收到用户的输入以打开指示灯,我希望调用以下命令:
灯开关(…)
其中开关为字符串输入

我将使用工厂方法选择特定的设备(灯),但具体的功能如何

调用desire方法(如果存在)的最佳实践是什么。 反射是一种方式,还是我可以不使用反射来思考设计?
谢谢

我认为您正在寻找一个有助于制定战略的团队

您描述的每个不同的“操作”都是一种策略。所有这些策略都必须实现相同的接口(可能是一个名为“Do/
Invoke
/
Execute
获取设备参数”的方法)

抽象工厂被赋予一些指示所需策略的内容,并返回该策略的具体实现(通常通过
开关

举一个例子,您将有一个由类实现的“打开”策略,并且在该策略的方法中,如果给定的设备是合适的(例如,如果它是可切换的),它可以在该设备上调用该方法,如下所示:

ISwitchable switchable=device as ISwitchable;
if (switchable!=null)
{
    switchable.Switch();
}
此时,您可以看到问题中的ISwitchable接口没有任何用处,因为您正处于一个试图打开某些东西的操作中,但它所要使用的只是一个切换开关的方法(设备可能已经“打开”)。但我相信你能解决这些细节。请记住,不同的操作可能需要设备来实现其他接口


我认为问题中的
IDevice
接口是多余的-只需使用
object
。当然每个设备实现哪些操作接口更有价值,这就足够了。

例如,您可以在基类中定义一个通用的
虚拟/抽象方法,例如,
Do()
,每个设备都会用具体的实现覆盖该方法。为什么您觉得需要接受用户提供的方法名称?我投票决定结束,因为这个问题很不清楚,但看起来你可能想得太多了。一个简单的
if(inputFromUser==“开启”)设备。开关(true);else设备。开关(错误)构造类型可能就是所需的全部。进一步阅读:,概念。如果用户可以发送很多“操作”,例如关闭、打开、打开/关闭、更改值,我会添加很多if语句?这正是我想要避免的。你认为控制一个灯泡需要多少种不同的操作?阅读关于雅格尼和亲吻的文章。有几个if语句或几个
开关
案例并不总是一件可怕的事情。如果你编造了一些更有趣的东西,你仍然需要验证用户的输入,以防止他们调用他们不应该访问的方法,因此不管怎样,你最终会在程序中得到一个有效操作的列表。