【问题标题】:C++ interfaces: how to avoid typing the same method name 3 times?C++ 接口:如何避免键入相同的方法名称 3 次?
【发布时间】:2013-03-18 15:07:45
【问题描述】:

作为this question 的后续:如果我创建一个纯虚拟接口类并将实现类拆分为头文件和源文件,我会得到以下信息:

界面:

class IDemo
{
    public:
        virtual ~IDemo() {}
        virtual void OverrideMe() = 0;
};

实现类,头文件:

class Child : public IDemo
{
    public:
       virtual void OverrideMe();
};

实现类,来源:

void Child::OverrideMe() 
{
    //doStuff
}

所以我需要将接口中声明的方法的名称重复 3 次——这不仅麻烦,而且令人困惑。有更好的方法吗?

【问题讨论】:

  • 不,没有。什么如此令人困惑?
  • 因为在接口加上头文件中声明了相同的方法。如果有人查看头部,他怎么知道这个方法声明实际上是从基类继承的?
  • 通过将第二个和第三个合并在一起键入两次。
  • @RomanR.: 我不想合并一个类的声明和它的实现。这就是首先使用“接口”的动机:我不想在“合同”中声明特定于实现的成员
  • 您的编译器可能支持接口的特殊语法,让您获得更多区别并提高可读性。例如,MSVC++ 有 __interface - 如果您不介意可移植性,您可以使用它来代替纯虚拟类(不过请仔细阅读文档)

标签: c++ design-patterns interface


【解决方案1】:

没有办法避免这种情况(除非您在头文件中编写定义,正如其他人已经建议的那样;正如 Botz3000 也建议的那样 - 不要这样做)。

这就是这样做的方法。


根据您的评论,我决定写一个答案:

我:

还有什么令人困惑的

你:

如果有人查看头部,他怎么知道这个方法声明实际上是从基类继承的

嗯,有两种方法 - 发表评论,例如:

/*
 * This overrides Base::OverrideMe
 */
virtual void OverrideMe();

当您将鼠标光标放在评论上时,大多数编辑都会向您显示此评论。

另一种方法是使用C++11,在函数后添加override关键字:

class Child : public IDemo
{
    public:
       virtual void OverrideMe() override;
};

这对于其他情况也很有用。你可能想看看this part of the wiki article about C++11: override

另见:Is the 'override' keyword just a check for a overridden virtual method?

【讨论】:

  • 我真的很喜欢使用覆盖的解决方案!
【解决方案2】:

不,没有好办法。
接口必须指定方法,因为它是其契约的一部分。
标头必须指定方法,以声明该类将覆盖它。
源文件必须指定方法,以便编译器知道实现属于哪个方法。我不觉得这令人困惑。

将出现次数减少到两次的唯一方法是在类的标题中实现该方法,但我强烈反对这样做。

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多