私は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();
}
私の問題は、「コンピューティング」の方法は、いくつかの再帰的なロジックを実装する必要があります、ということですので、このような何か含まれています:getChildren
はFrame*
とないのvector
を返すために、しかし
MechanicalFrame::compute()
{
for element in getChildren():
element.compute();
}
をMechanicalFrame*
、この時点でstatic_cast
を作成する必要があります。私はこの問題に多くの考えを与えてくれたが、私が見つけた解決策のどれも私には完全に満足されない:
ソリューション1)静的キャスト:何とかそれは悪いデザインが
解決法2)の追加を示しています基本クラス(Frame
)にメソッドを実装して、例外をスローします。派生クラスに基づいて親クラスの実装を強制するのは不自然です。
解決策3)Frame
から完全にMechanicalFrame
に分割する:これは既にFrame
で利用可能な多くの機能を再実装することを意味します。
ご協力いただければ幸いです。あなたがMechanicalFrame::getChildren()
内のすべてのFrame*
ポインタがMechanicalFrame
のインスタンスを指していることが確実な場合は事前に 感謝:)
基本クラスに 'Frame :: compute()'を作成し、 'virtual'にします。問題は、基本クラスをインスタンス化する予定ですか? 'Frame'を抽象クラスにすることは良い考えです。 – pSoLT
'MechanicalFrame :: getChildren()'の 'Frame *'ポインタが 'MechanicalFrame'インスタンスを指していることが確かであれば、' static_cast'には何の問題もありません。デバッグビルド**で 'dynamic_cast' +' assert'を使って間違いをキャッチするようにしてください。 –
@VittorioRomeo本当に醜いデザインです。 – pSoLT