0

当我需要根据对象的类型调用不同的函数时,我使用虚拟方法。但是,当我有两个未知类型的对象时,我该怎么办?我有所有可能组合的代码,但实际调用它的最佳方法是什么?

示例

有抽象类,它有后代,Shape例如PointLine和。我们需要一个函数,它返回这些形状的最近点之间的最短距离,例如:PolygonCircle

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()) {
            ...
        }
    ...
}

不过,这似乎有点笨拙,而且可能效率低下。那么,有没有更好的方法呢?

4

0 回答 0