繁体   English   中英

大型抽象基类

[英]Large abstract base classes

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

在实现类中查找要在基础 class 中实现的所有函数有点乏味,主要是因为 MSVC++ 没有告诉您哪个 function 您未能实现,并出现编译器错误“无法构造抽象类”

所以,我想知道我的大型抽象基础 class 是一个坏主意,还是我应该将它分成几个接口,或者是否有一个编译器警告我可以激活它会告诉我哪种方法我未能提供实现。 . 或者这只是抽象类编码的一部分,我应该习惯它。

*它的作用是在几个不同的渲染子系统之间提供一层通用功能。

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

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

当您制作抽象基础 class 时,纯虚拟方法的数量并不重要(对我而言),但应该清楚为什么从该接口派生的每个 class 都必须实现每个纯虚拟 ZC1C425268E68385D14AB5074C17Z9。 如果您发现自己在想“为什么我必须实现这个 function?”,将抽象 class 分解为几个不同的接口可能是合适的。

这个问题没有明显的正确答案。 决定是否将基础 class 分解为多个抽象基类可能应该是您根据基础 class 是否在逻辑上代表几个不同的概念而不是根据糟糕的编译器错误消息做出的决定。 如果您这样做的唯一原因是编译器错误消息,您可能需要检查是否可以升级编译器,或者是否有其他原因这样做。 大多数现代编译器应该提供非常好的、详细的错误。

如果您的设计建议您实际上可能希望拥有多个不同的类来实现基本 class 的一小部分,则将接口拆分为多个部分可能是一个好主意。 如果您希望这样做,则将接口分开可能是有利的。 但是,您会从中看到一些额外的复杂性。 例如,如果您有一个接口类型的指针指向实现多个接口的 object,您可能必须进行某种交叉转换以获得正确的类型,或者您可能必须引入一个新的抽象 class 来表示继承的东西来自所有不同的接口类型。 多个具有接口类的 inheritance 也可能导致一些名称冲突,但如果接口设计正确,这通常不是问题。

简而言之,出于编译器错误的原因,我强烈建议不要这样做,但如果您认为这是一个很好的设计决策,那么无论如何都是 go 。 如今,编译器已经足够好,您很少(但不是从不)需要围绕它们构建您的设计。

无论如何,这么大的 class 是一团糟,上帝 class 反模式。 使用聚合/组合拆分 class 并查看 SOLID 开发原理,看起来单个 class 的 30 种方法不遵循单一责任原则,至少......所以我想建议重新考虑 ZA2F2ED4F8EBC2CBB4ZC20 的设计。 祝你好运!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM