以下のOOP構造を考えてみましょう。基本クラス(インタフェース)は、いわゆる「ノード」クラスです。他の2つのクラスは 'Node'、つまり 'ElementNode'、 'TextNode'から継承します。多形のコンテナ(vector>)を使う必要があります。ある時点で、ベクトルを介して抽出された要素から、アップキャスティングによって隠された要素、例えば 'TextNode'のテキストを取得する必要があります。私の質問は、賢明な設計であれば、隠しメンバーにアクセスするために基本クラス 'Node'に仮想メソッドを追加し続けても問題ありません。別の選択肢はダウンキャスティングを利用することであろう。デザインに欠陥がありますか?それがあなたに何を示唆していますか? C++での必要に応じて基本クラス(インタフェース)に仮想メソッドを追加しても構いませんか?
例コード:
class Node {
public:
Node() {};
virtual ~Node() {};
NodeTypes getNodeType() const { return nodeType; };
virtual std::vector<std::shared_ptr<Node>> &getChildren() = 0;
virtual void pushChild(std::shared_ptr<Node>) = 0;
private:
NodeTypes nodeType;
std::vector<std::shared_ptr<Node>> children;
};
class ElementNode : public Node {
public:
ElementNode(HtmlElements, Node*);
void setTag(HtmlElements);
//Inherited methods.
std::vector<std::shared_ptr<Node>> &getChildren();
void pushChild(std::shared_ptr<Node>);
Node* getFather() const;
};
class TextNode : public Node {
public:
TextNode(std::string);
std::string getText() const;
void setText(std::string);
//Inherited methods.
std::vector<std::shared_ptr<Node>> &getChildren();
void pushChild(std::shared_ptr<Node>);
Node* getFather() const;
private:
std::string text;
};
保護されたデータを持つデザインには欠陥があると言えます。 –
保護されている場合は、この場合はprivateで置き換えることができます。ここでは意味がありません。私はそれを私的に変更しました。 –
ユースケースに大きく依存していますが、私は恐れています。バーチャルファンクションアプローチを好む一方で、長いチェーンの早い段階で行われる「dynamic_cast」によって可読性を大幅に向上させることができます。そのチェーンを単一の仮想関数に束ねることはより良いことですが、それでもすべての場合に適合するわけではありません。 – user4581301