0

要求特定基类的子类程序员做事(没有编译时强制)是否被认为是 C++ 中的好习惯?例如...

这个类的正确子类应该做这些事情:

  • 在每次调用重写的虚函数 bar() 结束时正确填充受保护的变量 m_foo - 请参阅上面的注释(此 SO 问题中未显示一些 c++ 注释)

  • 如果满足这些条件: [某些条件] 然后在每次调用被覆盖的虚函数 bar() 时,调用在此基类中实现的非虚函数 baz()。这是为了执行一些所有子类都应该通用的逻辑。

像这样的子类指令是否被认为是可以接受的,或者我没有在编译时强制执行这一事实是否表明我的代码设计存在缺陷?

4

4 回答 4

1

您的两种情况听起来都可以通过调用 bar() 的基类包装器来解决,例如:

   class base
   {
      public:
        virtual void vbar() = 0;

      protected:
        void bar()
        {
            vbar();
            m_foo = x;
            baz();
        }


        void baz()
        {
             ... do stuff ... 
        }
      private:
        T m_foo;
    }
于 2013-02-09T21:30:09.407 回答
1

您可以通过使用模板方法模式来强制执行这种事情(派生类的作者不需要做任何事情)。

于 2013-02-09T21:21:38.033 回答
0

与我一起工作的高级开发人员(我想我们可以称他为架构师)喜欢说“永远不要问,什么时候知道”。

他的意思是,我碰巧非常同意,就是当你的基类可以强制一个子类以你应该的方式做某事时。

出现这种情况:
1)如果一个变量应该总是由派生类初始化(比如类的“名称”),它应该是所有构造函数的必需参数。
2)如果您需要在某事之前/之后执行某种逻辑,请将虚函数包装在一个具体的函数中,以强制之前/之后发生。
3) 如果您发送的是相同类型的 msg,则 msg 的打包应该在基类中,使用纯虚方法从类的实例中提取数据。

于 2013-02-09T21:42:36.380 回答
0

前置条件和后置条件是方法契约的一部分(软件工程而言)。所以不,要求实施者遵守某些规则并不是坏事。只要确保它们被清楚地记录在案。无论如何,这些条件中的大多数都无法在编译时检查(尽管在运行时检查它们并不是一件坏事......)

于 2013-02-09T21:23:51.397 回答