大型的抽象基类

5

我正在编写一个大型的抽象基类,其中包含30多个纯虚方法*。

在实现类中找到所有需要实现的函数有点繁琐,主要是因为MSVC++不会告诉你哪个函数没有实现,只会显示编译器错误“无法构造抽象类”。

所以,我想知道我的大型抽象基类是否是一个不好的想法,或者应该将其拆分成几个接口,或者是否可以激活编译器警告,告诉我未提供实现的方法是哪个...或者这只是使用抽象类的一部分,我应该习惯它。

*它提供了几个不同渲染子系统之间的共同功能层。


2
我的 MSVC 告诉我哪些函数是抽象的。 - Puppy
1
如果你能将接口分解成清晰的组件,请这样做。我不会声称对此有一个好理性的原因,但我认为这显然是一件好事情。 - Adrian Ratnapala
4个回答

4

我认为接口类本质上是不好的,但是提出的问题使得这个特定应用程序听起来可疑。

如果有从该接口派生的类,并且不清楚需要覆盖哪些函数,则似乎表明所有这些函数可能都不是必需的。

当您创建抽象基类时,纯虚方法的数量并不重要(对我来说),但应清楚地说明每个从此接口派生的类必须实现每个纯虚函数的原因。如果您发现自己在想“为什么我必须实现此函数?”,则可能适合将抽象类分成几个不同的接口。


2
最后一段真正深入到了这个问题的核心。 - Mark B

4
这个问题没有明显的正确答案。决定是否将基类分解为多个抽象基类应该是基于基类在逻辑上是否表示了多个不同的概念,而不是仅仅因为编译器出错信息不够清晰。如果你这样做的唯一原因是为了编译器出错信息,你可能需要检查并确保你可以升级编译器或者有其他原因这么做。大多数现代编译器都应该提供非常好的详细错误信息。
如果你的设计表明你可能希望有多个不同的类来实现基类的小部分,则将接口划分为几个部分可能是一个很好的主意。如果你期望这样做,分解接口可能会有优势。但你也会看到一些增加的复杂性。例如,如果你有一个指向实现多个接口的对象的一个接口类型的指针,则可能需要进行某种类型的交叉转换才能获得正确的类型,或者可能需要引入一个新的抽象类,表示从所有不同接口类型继承的内容。使用接口类的多重继承可能会导致一些名称冲突,但是如果接口被正确设计,通常这不会成为问题。
总之,强烈建议不要仅仅因为编译器出错原因就这样做,但如果你认为这是一个好的设计决策,那么请去做吧。现代编译器已经足够好了,你很少(但不是从不)需要构建你的设计围绕它们来进行。

0

总之,这样一个庞大的类是一团糟,是God类反模式。使用聚合/组合来拆分类,并查看SOLID开发原则,看起来单个类有30个方法不符合单一责任原则,至少...所以我建议重新考虑类的设计。祝好运!


0
通常,在出现“无法实例化抽象类”错误后(该错误在调用它的行处抛出),如果您在编写实现之前将接口复制并粘贴到类中,则会出现链接器错误“未解决的外部错误”,指向您忘记实现的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接