在我们的代码中,我们有一个封装介质(例如流体或固体)的物理问题(待解决)。
一个问题可以有多种类型(热传导、湍流……),所有类型都派生自基类,因此封装了不同性质的介质(例如,“湍流”类型的问题在流体上得到解决).所有媒体都继承自一个抽象基类。
同时处理继承(问题/媒介)和封装的优雅方式是什么?值得注意的是,每当我需要在派生问题中访问派生媒体类的特定功能时,我能否避免重复使用静态转换?
代码的简化说明版本:
class ProblemAbstract
{
public:
virtual void solve() = 0;
...
protected:
MediumAbstract * med;
};
class ProblemTurbulent: public ProblemAbstract
{
// ProblemTurbulent is always built with a MediumFluid
...
virtual void solve()
{
// Can I avoid this?
MediumFluid * med_f = static_cast<MediumFluid>(med); // MediumFluid derives from MediumAbstract
med_s->someSpecificFluidMethod();
}
};
最佳答案
我认为那个小模板不会伤害任何人,即使是没有经验的程序员
class ProblemAbstract
{
public:
virtual void solve() = 0;
...
protected:
MediumAbstract * med;
};
template <typename MediumTypeT>
class ProblemHelper :
public ProblemAbstract
{
protected:
MediumTypeT getMedium()
{
return dynamic_cast<MediumTypeT *>(med);
}
};
class ProblemTurbulent :
public ProblemHelper<MediumFluid>
{
// ProblemTurbulent is always built with a MediumFluid
...
virtual void solve()
{
getMedium()->someSpecificFluidMethod();
}
};
关于c++ - 避免强制转换以访问派生类的专门成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36032331/