当我需要根据对象的类型调用不同的函数时,我使用虚拟方法。但是,当我有两个未知类型的对象时,我该怎么办?我有所有可能组合的代码,但实际调用它的最佳方法是什么?
示例:
有抽象类,它有后代,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()) {
...
}
...
}
不过,这似乎有点笨拙,而且可能效率低下。那么,有没有更好的方法呢?