当我需要根据对象的类型调用不同的函数时,我使用虚方法。但是当我有两个未知类型的物体时,我该怎么办?我有每种可能组合的代码,但实际调用它的最佳方法是什么?
示例:
有一个抽象类Shape
,它有后代,例如Point
,Line
,Polygon
和Circle
。我们需要一个函数,它返回这些形状的最近点之间的最短距离,例如:
double shortestDistance(const Shape &first, const Shape &second);
没有办法简化这个问题(至少在我的情况下不是这样),以避免实际上必须为每个组合使用不同的代码。
我目前的解决方案是让Shape有一个纯虚方法返回它的实际类型(作为枚举),然后在两个嵌套的switch语句中使用这个值,然后对参数进行类型转换,最后调用特定组合的相应函数,比如这样:
switch (first.getType()) {
case POINT:
switch (second.getType()) {
case POINT:
return shortestDistancePointPoint((const Point &) first, (const Point &) second);
case LINE:
return shortestDistancePointLine((const Point &) first, (const Line &) second);
...
}
case LINE:
switch (second.getType()) {
...
}
...
}
虽然看起来有些笨拙且可能效率低下。那么,还有更好的方法吗?