2

私はオブジェクトの階層構造を持っています (3 レベルとしましょう)。

クラス A はクラス B で構成され、クラス B はクラス C で構成されます。

初期化は次のようなことを行います:

$a1 = new A()
$a1->add('B1', $b11 = new B())
$a1->add('B2', $b12 = new B())
$b11->add('C1', $c111 = new C())
$b12->add('C1', $c121 = new C())
...

私の問題は、$c121取得したいときに発生します$c111。私は現在、それを達成するための2つの方法を知っています:

1/ A がシングルトンであると仮定します。これにより、ツリーの任意のノードからルートに戻ることができます。次に、完全な「パス名」を使用して、ルートから任意のノードをアドレス指定できます。

2/ 各オブジェクトに祖先を与えて、ツリーを (パス名で) 行き来できるようにします。

どちらも私のニーズに応えますが、満足のいく解決策は見つかりません。

何か不足していますか?これは一般的な問題のはずですが、どの設計パターンがこの問題に一致するかわかりません。

編集階層は同様のアイテムで構成されていないことに注意してください。したがって、それは固定された階層です。各レベルのアイテムの数量のみが変動しています。(例: クライアント、注文、注文した製品)

4

2 に答える 2

1

クラスがばらばらである場合は、そのように扱います (つまり、ツリー自体はありません)。
異なる要素を、まるで似ているかのように扱おうとしているようです。

包含クラス (親と呼んでいるもの) へのアクセスが必要な場合は、参照を提供する必要があります

上記の例では、関連付けられたオブジェクトにそれを「保持」するオブジェクトへの参照を与え、C クラスにその兄弟を取得する手段を与えます。

$c121=new C(this);   // pass reference to container
$c121->getSiblings();  // method to get sibling through reference to containing object

それを見る別の方法は次のとおりです。

$frank=new Customer()
$frank->add('Order01', $order1 = new Order())
$frank->add('Order02', $order2 = new Order())
$order1->add('LineItem01', $item1 = new LineItem())
$order1->add('LineItem02', $item2 = new LineItem())

$order1->getOrder() //return collection
$order1->getOrder()->getItems() //return collection items/siblings
于 2012-08-28T20:54:36.910 に答える
0

両方を行います。Eclipse では、ツールがモデル ルートに応答する既知のクラスにメソッドを実装するのが一般的です。ツリーに表示されるオブジェクト (視覚的にはツリー アイテムのように、実装に関しては UI ウィジェットのように) はすべて親を認識しており、継承された getParent() 呼び出しを通じて親を取得できます。

于 2012-08-28T20:22:08.717 に答える