首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义一个接受不同参数的接口方法

定义一个接受不同参数的接口方法
EN

Stack Overflow用户
提问于 2008-10-26 16:15:12
回答 6查看 13.4K关注 0票数 11

我的应用程序使用连接到PC的测量仪器。我希望能够使用来自不同供应商的类似工具。

所以我定义了一个接口:

代码语言:javascript
复制
interface IMeasurementInterface
    {
        void Initialize();
        void Close();
    }

到目前一切尚好。在测量之前,我需要设置仪器,这意味着对于不同的仪器,参数是非常不同的。所以我想定义一个接受参数的方法,它可以有不同的结构:

代码语言:javascript
复制
interface IMeasurementInterface
{
    void Initialize();
    void Close();
    void Setup(object Parameters);
}

然后,我会将对象强制转换为我需要的任何对象。这是要走的路吗?

EN

回答 6

Stack Overflow用户

发布于 2008-10-26 16:27:15

你最好想出一个抽象的“参数”类,这个类由每个不同的仪器参数扩展……例如,然后使用泛型来确保将正确的参数传递给正确的类……

代码语言:javascript
复制
public interface IMeasurement<PARAMTYPE> where PARAMTYPE : Parameters
{
    void Init();
    void Close();
    void Setup(PARAMTYPE p);
}

public abstract class Parameters
{

}

然后对于每个特定的设备,

代码语言:javascript
复制
public class DeviceOne : IMeasurement<ParametersForDeviceOne>
{
    public void Init() { }
    public void Close() { }
    public void Setup(ParametersForDeviceOne p) { }
}

public class ParametersForDeviceOne : Parameters
{

}
票数 13
EN

Stack Overflow用户

发布于 2008-10-26 16:50:42

对我来说,Factory模式听起来可能很有用,特别是如果你要对你的应用程序进行单元测试。

票数 2
EN

Stack Overflow用户

发布于 2008-10-27 06:26:29

如果您要处理多个设备类型,那么控制器+设备接口分离将是一个很好的解决方案。

解耦

使用名称值对允许您将代码分离到设备+控制器+应用程序代码结构中

示例代码

代码语言:javascript
复制
class DeviceInterface
    {
    void Initialize(IController & Controller);
    void Close();
    bool ChangeParameter(const string & Name, const string & Value); 
    bool GetParam(string & Name, string &Value );
    }

每个设备实现在创建时都应该使用控制器的标识来创建,该控制器可以接受其命令并将其转换为实际的设备命令

代码语言:javascript
复制
interface IController
   {
   Initialize(DeviceSpecific & Params);
   Close();
   bool ChangeParameter(string & Name, string & Value);
   bool ChangeParams(string & Name[], string &Value []);
   }

您的用户代码将如下所示

代码语言:javascript
复制
IController     objController = new MeasurementDevice(MeasureParram);

DeviceInterface MeasureDevice = new DeviceInterface(objController);

string Value;

MeasureDevice.GetParam("Temperature", Value);

if (ConvertStringToInt(Value) > 80)
     {
     MeasureDevice.ChangeParameter("Shutdown", "True");
     RaiseAlert();
     }

DeviceInterface类所要做的就是将命令传递给控制器。控制器应负责设备通信。

接口分离的优势

防止更改

这种类型的解耦将允许您将应用程序代码与控制器隔离。设备中的更改不会影响用户代码

应用程序代码可维护性

此外,用户代码始终是干净的,您只需要处理应用程序逻辑。但是,如果您定义了多个接口/创建了具有多种类型的特定于控制器的参数结构的模板或泛型,那么您的代码中将包含大量与设备相关的垃圾,这可能会损害可读性,并在设备/其参数更改时产生维护问题。

实现简化

您还可以将不同的控制器实现划分到自己的项目中。此外,您的应用程序还可以使用XML文件等在更动态的环境中配置命令和响应,这些文件可以与控制器类一起提供,这样整个应用程序本质上就会变得更加动态。

真实生活

来自该领域领导者的最新生产控制器项目之一也以同样的方式工作。但他们使用LON进行设备通信。

LON ?

控制器(比如空调/锅炉/风扇等)中使用的LON协议网络使用此概念与各种设备通信

因此,您需要的只是一个接口,该接口可以与您的设备通信,然后使用LON将名称值对发送到设备。使用标准协议还允许您与测量仪器以外的其他设备进行通信。如果您的设备使用LON,则可以使用LON的开源实现。

如果你的设备不支持LON,那么你可能不得不设计一些东西,用户代码仍然在名称值对上工作,而相反的接口将你的名称值对翻译成一个等价的对应控制器struct+,并以设备能够理解的方式与个体设备通信。

希望这能对你有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/238184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档