2012-05-09 19 views
1

子クラス内のメソッドにアクセスできるようにするには、親クラスが必要です。子クラスは、継承された親クラスメソッドにアクセスできることは明らかです。クラス内のクラスに別のクラスからアクセスする

しかし、子供Aが子供Bに属するおもちゃを借りたい場合はどうなりますか?子供Aは、子供Bからそのおもちゃを借りることが大丈夫であれば、親に尋ねる。親は、子供Aに、子供Bの部屋からそれをつかみ、それを子供Aに与えて遊ぶことを伝える。

また、私がここで必要としていることを説明するために、このシナリオを作成しました。これを行う方法については、実際にはわかりません。

[STORY]

新しい家を購入したとします。あなたはあなたの時間の特定の領域を塗り直す必要があります。ああ、ちなみに、あなたの配管が見える必要があります。

私たちはPerson、House、Painter、&配管工を持っています。

人は、家の中で問題のある領域を見つけ出し、書き留めます。その人は配管業者と画家を見つけて、彼らの問題を報告する必要があります。

その後、配管工とペインタは、自分の仕事を引き継ぐための専用の道具と設備を持って、家に現れます。

ハウスは、これらの領域を持っているでしょう:

  1. トイレ
  2. シンク
  3. シャワー
  4. エクステリアサイディング
  5. インテリア壁

    • 配管工はトイレ、シンク、シャワーにアクセスする必要があります。
    • ペインターは、外装サイディングとインテリアウォールにアクセスする必要があります。

だから、配管工、画家は、彼らがベストを尽くす何を始めるために家に到着しました。

最初に、配管工は内部で作業を行う必要があるので、配管工が完了したら、内部サイディングを塗装して内壁に移動します。

配管工は仕事を終えました。配管業者は、仕事が完了したことを知らせるために人に報告します。

人物はその後、配管工が終了したことをペインタに伝え、ペインタの準備ができたらペインタは内壁の塗装を開始することができます。

このシナリオでは、どのクラス構造が最適でしょうか?私は興味を持っているいくつかのパターンを読んだ。

コマンドパターン&オブジェクトプーリング。

私は、オブジェクトプーリングがより多くのルートを取ると思っています。ここに入力はありますか?

また、Object Poolingルートを使用した場合、コンストラクタ内で各クラスをインスタンス化し、後で使用できるようにするのがよいでしょうか?または、私はそれを使用する必要があるときにのみ、各クラスをインスタンス化する必要がありますか? (おそらく、いくつかの "実行"または "実行"メソッドを介して行われます)。

例が分かるだろう。

また、静的呼び出しを使用しないことをお勧めします。

+0

別の例:のは、親が読んでいたものを本child_a知りたいと思ったとしましょう '$ parent->ラン( 'child_a'、 'get_book');に等しくなり、' '$ child_a->。 get_book(); ' –

+0

get_book()はベースクラスで定義され、メソッドがベースクラスで定義されていない場合は派生クラスに実装されます。派生クラスメソッドについては、どのように知ることができますか? – Brady

+0

'child_a'は親クラスで自動的にインスタンス化されます。 'get_book()'はサブクラス 'child_a'で定義されています。親メソッドは単に 'child_a'メソッド' get_book(); 'を実行する必要があると言うだけです。 –

答えて

0

私が正しく理解していれば、あなたのサブインスタンスへのすべての参照を保持する親クラスにstatic変数を作成することです(たとえば、function __constructにインスタンスを追跡する必要があります)。 。function __destruct

class Parent { 
    public static $references = array; 

    public function __construct() { 
     Parent::$references[] = $this; 
    } 

    public function __destruct() { 
     // loop through $references and kill $this from it. 
    } 

    public function run($ref, $func) { 
     // find the reference in $references and store to $r 
     if (method_exists($func, $r)) { 
      $r->$func(); 
     } 
    } 
+0

が私の質問を更新しました。 –

関連する問題