我是 C++ 的新手,现在在我的设计中我似乎无法避免向下转型。我知道这通常是糟糕设计的标志,所以我想知道执行此操作的更好方法是什么。
我有一个 Frame
类,它表示几何框架树并允许它们之间进行几何变换:
class Frame
{
private:
Frame *_parent;
std::vector<Frame*> _children;
public:
Frame* getParent() const;
std::vector<Frame*> getChildren() const;
... (extra methods for geometrical transformations)
}
我现在想创建一个新的 Frame
子类,MechanicalFrame
,它添加了一些处理动态属性的功能。
class MechanicalFrame
{
private:
double mass;
...
public:
void compute();
}
我的问题是,“计算”方法需要实现一些递归逻辑,因此它会包含如下内容:
MechanicalFrame::compute()
{
for element in getChildren():
element.compute();
}
但是,由于 getChildren
返回 Frame*
而不是 MechanicalFrame*
的 vector
,我需要此时制作一个static_cast
。我已经对这个问题进行了很多思考,但我找到的解决方案中没有一个让我完全满意:
解决方案 1) 静态转换:它以某种方式指示糟糕的设计
解决方案 2) 将计算方法添加到具有虚拟实现的基类 (Frame
),即抛出异常:强制基于派生的父类实现似乎不自然类。
解决方案 3) 从 Frame
中完全拆分 MechanicalFrame
:这意味着要重新实现 Frame
中已有的许多功能。
任何帮助将不胜感激。 非常感谢:)
最佳答案
使用多态行为,使用你的解决方案 2)
您可以遵循以下模式(接口(interface) -> 基类 -> 派生类)
class IFrame
{
public:
virtual void compute()=0;
}
class Frame:public IFrame
{
public:
virtual void compute() {/*nothing to do*/}
}
class MechanicalFrame:public Frame
{
public:
virtual void compute() {/*your implementation with mass*/}
}
关于c++ - 避免在继承的树类中向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41673695/