"Multiplicity of implementation" - 如何处理它?这种东西的"名称"是什么?
"Multiplicity of implementation" - how to deal with it? And what's the 'name' of such thing?
我的问题有点关于编程技术,或者可能是设计模式。假设有几个类派生自包含纯虚方法的base,该类之间应该进行一些交互。
例如,Rectangle
, Ellipse
, Triangle
和Line
-都是由一个Shape
衍生而来。这个抽象类Shape
包含virtual bool Intersects(Shape* another) = 0
。
看起来,我需要做六个实现,对吧(顺便说一句,在这个特定的例子中有更好的解决方案吗?)
目前我想不出其他的例子。
也许我说的是一件众所周知的事情,我几乎可以肯定有一些名字描述了这种技术。然而,我甚至不知道该在网上输入什么才能找到它。
好吧,你能告诉我如何实现这样的事情(我仍然想知道是否需要任何辅助方法,或者,也许,RTII
的dynamic_cast
?)或点一些来源(艺术,教程或其他)?
这是学校课本双重分发的例子,维基百科的文章很好地描述了问题和解决方案:
http://en.wikipedia.org/wiki/Double_dispatch如果我没记错的话,在Andrei Alexandescu的《Modern c++ Design》一书中有一个非常优雅的解决方案
http://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315一个简单的事实是,您错误地使用了继承。你应该有一个代表所有由一系列顶点组成的形状的VertexShape,和一个代表所有由数学公式描述的形状的FormulaShape,而不是像线条、方框、三角形那样的继承。
不应该使用继承来建模关系,这些关系可以通过简单地改变必须在类中出现的数据来建模——例如,用于构建多边形的顶点。
编辑:不,不,不。使用模板。如果你走投无路,就专攻它。这就是它的作用。提供零开销的通用算法。伙计们,我们在90年代发现了这个东西。相关文章:
- C++中名称篡改的目的是什么
- 在命名空间名称之前加上 :: 是什么意思?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 假设声明中某些上下文中需要的名称查找规则是什么
- 朋友定义函数的名称空间是什么
- ELI5 函数名称后面的"&&"关键字是什么意思
- 多维数组的类型、名称是什么?
- 在Visual Studio中生成的匿名命名空间变量的损坏名称的数字部分是什么意思
- 当我使用我的向量名称后跟包含整数变量的括号时,括号是什么意思
- GCC,Apple LLVM和MSVC编译器的不同部分的名称是什么?
- 该加密算法的名称是什么
- 模板参数列表中只有一个类型名称是什么意思?
- "<<"和">>"运算符的名称是什么?
- 诸如class bar *bar之类的指针的名称是什么?
- 括号中的课堂名称是什么?C
- 生成文件:此警告的名称是什么?
- 在C 中获得班级名称的一些好技术是什么?
- 由于名称篡改,输出文件中可见的内容是什么
- 扩展std名称空间被认为是未定义行为的原因是什么
- 这个运算符 ->* 的名称是什么?