【发布时间】:2021-06-25 15:55:10
【问题描述】:
我正在研究一种聚合物模拟代码,该代码使用桥模式来分离抽象(模拟中涉及的对象)及其实现(它们是如何表示的,例如每个单体一个粒子、连续网格等)。我面临的一个问题是我正在努力定义抽象的类层次结构,其中较低的抽象可以执行在层次结构中更高的其他类上定义的函数。
我想定义一个基本抽象Monomer,它包含许多调用MonomerImpl 实现的方法。比如说,一种方法applyDisplacement 在空间中移动单体。但是,当我定义派生抽象MonomerTypeA 和几个实现MonomerTypeAImplGrid、MonomerTypeAImplParticles 等时,我想调用applyDisplacement,定义在层次类的顶部,但使用我的具体实现单体类。
这是我尝试过的一个例子:
class Monomer
{
public:
...
void applyDisplacement(Vector displacement)
{
getImplementation()->applyDisplacement(displacement);
}
private:
std::unique_ptr<MonomerImpl> p_impl;
virtual MonomerImpl* getImplementation();
};
class MonomerImpl
{
public:
...
void applyDisplacement(Vector displacement)
{
for (int i=0; i<positions.size(); i++)
{
positions[i] += displacement;
}
}
private:
std::vector<Vector> positions;
};
还有:
class MonomerTypeA : Monomer
{
public:
...
private:
std::unique_ptr<MonomerTypeAImpl> p_impl;
MonomerImpl* getImplementation()
{
return (MonomerImpl*) p_impl.get();
}
};
class MonomerTypeAImpl : MonomerImpl
{
...
}
如果我使用虚函数getImplementation 函数只能返回一个MonomerImpl* 指针,那么我就无法实现任何附加功能。或者,如果我尝试放弃继承而只定义一堆不同的实现,我将有很多代码重复。
有没有两全其美的解决方案?
【问题讨论】:
-
如图所示,您没有任何派生类。您是否打算让
MonomerTypeA继承自Monomer?
标签: c++ inheritance design-patterns polymorphism