我正在构建一个几何库,但我遇到了一些设计问题。
我有这个(简化的)设计:
我的基类是几何。它实现了一种计算两个几何图形交集的方法
class Geometry
{
Geometry* intersection(Geometry* other)
{
//...compute intersection...
//another lib does some work here
Geometry* inter = compute_intersection()
return inter;
}
};
我也有一些来自几何的课程。
假设我有:
class Point : public Geometry
{
};
和
class Polyline : public Geometry
{
};
我的方法 intersection 返回一个几何,因为我不知道交集的结果是点还是折线。当我想使用生成的几何图形时,我的问题就出现了。
让我们在我主要的某个地方说,我愿意
Geometry* geom = somePolyline->intersection(someOtherPolyline);
我知道 geom 实际上是一条折线。当我尝试做
Polyline* line = dynamic_cast<Poyline*>(geom)
它返回一个 NULL 指针,这是正常的,因为 geom 的真实类型不是折线,而是几何。我可以尝试 reinterpret_cast 但是我失去了多态行为。
我的问题是:我可以像这样修改我的交集方法:
Geometry* intersection(Geometry* other)
{
//...compute intersection...
Geometry* inter = compute_intersection()
// the intersection is computed by another lib and I can check (via a string)
// the real type of the returned geometry.
// cast the result according to its real type
if (inter->realType() == "Polyline")
return dynamic_cast<Polyline*>(inter);
}
如果这不是一个好主意(我认为不是),那么做这样的事情会有什么好的设计?
提前致谢
(抱歉问题标题不好,我找不到好东西)