【问题标题】:How to define common interface in C++如何在 C++ 中定义通用接口
【发布时间】:2020-10-29 16:56:31
【问题描述】:

我在 C++ 中有以下抽象类

class Converter
{

    public:
        virtual void enable(void)                          = 0;
        virtual void setReferenceValue(double)             = 0;
        virtual void registerAlarmListener(AlarmListener*) = 0;
        virtual void confirmAlarm()                        = 0;
        virtual void notifyParameterChange()               = 0;
        virtual void update(void)                          = 0;

}

我的意图是这个抽象类将成为所有人的通用接口 我的应用中的各种电力电子转换器。不幸的是我有 遇到问题如何模拟各种电力电子设备时的情况 转换器有一组参数和一组警报,但那些项目 设置取决于每种类型的转换器。所以我不知道如何完全声明 方法confirmAlarmnotifyParameterChange 因为我不知道怎么做 声明形式参数的类型。我可能需要定义某种类型 它将模拟一个常见的参数列表和常见的警报列表。任何人都可以 给我一个建议怎么做?提前感谢您的任何想法。

【问题讨论】:

  • confirmAlarm 没有输入也没有输出 - 你可以随心所欲地编写它。
  • 你的问题对我来说不是很清楚。是说您的派生类需要为confirmAlarm()notifyParameterChange() 函数采用不同的参数?
  • 通用接口的问题是函数参数都必须相同。如果你不能让所有需要实现函数的类都用相同的参数实现函数,即使有些被忽略了,你也需要回到你的设计,找出哪里出了问题。
  • 弗拉德在下面的回答中有一个可行的解决方案,但要知道这种方法的缺点是调用者有责任知道他们持有什么派生对象并传递适当的参数。这与使用dynamic_cast 然后调用不在接口中的函数没有太大区别。通用接口中“不常见”功能的存在表明 the Liskov Substitution Principle 被违反,所以要小心。
  • @Steve 如果您对界面进行模板化,您将不再拥有“通用”界面。由您决定这是否适用于您的用例。

标签: c++ interface abstract-class


【解决方案1】:

您可以通过多态来做到这一点:定义 BaseParamBaseAlarm 类,并使用指向它们的 vectors 指针作为函数的参数。

或者,您可以使用vector of std::variant

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2014-10-15
    • 2011-03-17
    • 1970-01-01
    相关资源
    最近更新 更多