我知道访客模式是什么以及如何使用它;这个问题不是这个问题的重复。
我有一个库,其中放置了我编写的大部分可重用代码,并链接到我的大多数项目。
通常我需要向某些类添加特性,但没有将这些新特性添加到库中。让我用一个真实的例子:
在这个库中,我有一个类,由和Shape
继承。CircleShape
PolygonShape
CompositeShape
我现在正在开发一个图形应用程序,我需要在其中渲染这些Shape
,但不想render
在核心Shape
类中放置一个虚函数,因为我使用的一些项目Shape
不进行任何渲染,而其他图形项目可以使用不同的渲染引擎(我在这个项目中使用 Qt,但对于游戏我会使用 OpenGL,因此该render
函数需要不同的实现)。
当然,最有名的方法是使用访问者模式,但这让我产生了一些疑问:
任何库的任何类都可能需要像我Shape
一样进行扩展。大多数公共图书馆(几乎全部)都不提供对访问者模式的任何支持;为什么?我为什么要?
访问者模式是一种在 C++ 中模拟双重调度的方法。它在 C++ 中不是原生的,需要显式实现,这使得类接口更加复杂:我认为该applyVisitor
函数不应该与我的类函数处于同一级别,我认为这就像破坏抽象。
显式向上转换Shape
更dynamic_cast
昂贵,但对我来说它看起来像一个更清洁的解决方案。
所以我该怎么做?在我所有的库类中实现双重调度?如果提供的库Shape
不是我的,而是在互联网上找到的一些 GPL 库怎么办?