前文:基本クラスが派生型を認識して相互作用を行うのは悪い設計ですか?私はそうではないと思いますが、次の場合、どのようなアプローチを検討する必要がありますか?
(言語はPHPですが、この質問はデザインパターンのより広い主題に関係していると思います)
ノードとして機能するクラスのセットをモデル化しようとすると、ジレンマが発生します。私は自分のデザインの決定を2番目に推測し続けます、そしてそれは永続的な欲求不満につながります。
このパラメータのセットが与えられた場合:
- ノードには親参照があります(一方向トラバーサル)
- Nodeから派生したオブジェクトタイプは、Nodeから派生した他のオブジェクトタイプの親(または子)になる可能性があります。
だから私は持っています:
abstract class AbstractNode{
protected $_parent;
public function __construct(self $parent = null){
$this->_parent = $parent;
}
public function get_parent(){
return $this->_parent;
}
}
class NodeOne extends AbstractNode{ }
class NodeTwo extends AbstractNode{ }
// more derivatives
ここで、私の設計のジレンマが発生します。トラバーサル中にNodeOne
、インスタンス自体と、派生したタイプの他のインスタンスを見つける必要がある場合がありますAbstractNode
(この機能はインスタンスに限定されないことに注意してください。ただしNodeOne
、これは単なる例です) 。
これにより、タイプ固有のトラバーサルで、たとえば、ツリーの上位にある特定のタイプのオブジェクトからのデータを集約できます。私はこの目的を果たすための方法を専門にすると思いました:
public function get_node_one_ancestor(){
if($this->_parent instanceof NodeOne){
return $this->_parent;
}
if(null !== $this->_parent){
return $this->_parent->get_node_one_ancestor();
}
return null;
}
派生型はインスタンスをトラバースする必要がある可能性があるためNodeOne
、このメソッドを基本クラスに配置することは理にかなっていますがAbstractNode
、私の基本クラスでは派生型を認識する必要があります。
これは悪臭があると思いますが、この方法が他にどこに行けばいいのかわかりません。考えられる解決策の構造設計パターンについて読んでいます。
頭に浮かぶアナロジーはDOMであり、特定のタイプの祖先トラバーサルを実行します。
<root>
<foo id="1">
<bar id="2"></bar>
<bar id="3">
<foo id="4">
<bar id="5">
<foo id="6">
<bar id="7"></bar>
</foo>
</bar>
<bar id="8"></bar>
</foo>
</bar>
</foo>
</root>
すべての祖先値
bar[@id='8']
の集計から: 結果foo
id
4 1
すべての祖先値
bar[@id='7']
の集計から: 結果foo
id
6 4 1