3

创建 C++ 继承结构时,必须在多个位置定义完全相同的成员函数:

如果 B 是一个抽象基类,并且 D、E 和 F 都继承自 B,你可能会有这样的情况:

class B
{
   virtual func A( ... params ) = 0;
};

class D : public B
{
   func A( ... params );
};

/* ... etc... similar implementations for E and F */

所以,这里显然有一些重复。如果到B的接口很大,如果接口需要改变,你可能有很多地方需要改变。

一位同事建议使用巧妙创建的嵌入式#includes 进行一些技巧,ala:

class D: public B
{
   #include "B_Interface.h"  // B_Interface.h is a specially crafted .h file
}

这似乎有点笨拙?是吗?有没有更好的解决方案来避免双重维护?

另外,也许这里的解决方案真的是更好的支持语言的工具,比如 Visual Assist X?

编辑:假设派生类必须具有唯一的实现。

4

5 回答 5

12

实际上,更改接口的最大问题通常是所有使用它的代码,而不是实现它的代码。如果对于实施者来说很容易改变它,它可能会让用户的生活变得更加困难。

于 2010-03-01T21:02:44.133 回答
4

改变一个广泛使用的界面是痛苦的不是一个错误。这是一个特点。

于 2010-03-01T21:15:56.317 回答
4

另外,也许这里的解决方案真的是更好的支持语言的工具,比如 Visual Assist X?

确切地。更改方法签名是重构工具的一个关键特性

于 2010-03-01T21:42:02.053 回答
1

如果您必须使用一些默认行为一遍又一遍地实现它们,那么也许它们应该只是虚拟的,而不是纯虚拟的。

于 2010-03-01T20:59:18.783 回答
1

与其将预处理器用于另一种不应该使用的方式,不如尝试我的编辑器(或 IDE,如果你喜欢的话。)

于 2010-03-01T21:07:22.827 回答