2016-12-21 4 views
1

私はPHPで親子クラスを使いたいが、サブクラスには入れない。たとえば、Houseクラスがあり、HouseにDoorsとWindowsがあるとします。phpオブジェクトの設計親子

class House { 
} 

class Door { 
} 

class Window {  
} 

私たちは2つのタイプのドアを持っています。ガレージドアとフロントドアの2つのタイプがあります。

class GarageDoor extends Door { 
} 

class FrontDoor extends Door { 
} 

どのように私はハウスとドアの間とハウスと私はドアを作成するとき、そこに少なくとも家でなければならないと私は特定の家を知っている必要があることを、このようなウィンドウ間の関係を作成することができます。そして、私が家を削除すると、そのドアと窓も削除する必要があります。どうやってやるの?

+0

Factoryパターンが役立ちます正しい方法でオブジェクトの作成を管理し、依存関係注入を使用します。 Observerパターンを使用すると、分解されるオブジェクトをリッスンしてアクションを実行できます。 –

+0

ドアは家の中のコンポーネントなので、House for Doorオブジェクト(または複数のドアがある場合はDoorオブジェクトの配列)にクラスプロパティが必要です。同様に、DoorのHouseへの参照があるかもしれませんが、これはカップリングにつながるかもしれませんが、私はこの場合重要ではないと考えています。 – SOFe

答えて

2

それが最善か、それについて移動するにも良い方法だと言って、それはあなたと遊ぶために何かを与える必要があり、別のものを試して、自分自身をしようとしていない:)

class House 
{ 
    /** 
    * An array of all doors that have been installed in the house. 
    */ 
    private $doors = []; 

    /** 
    * You can install a door in a house. 
    */ 
    public function installDoor(Door $door) 
    { 
     $this->doors[] = $door; 
    } 
} 

class Door 
{ 
    /** 
    * A reference to the house this door is installed in. 
    */ 
    private $house = null; 

    /** 
    * A house is required before a door can be created. 
    */ 
    public function __construct(House $house) 
    { 
     $house->installDoor($this); 
     $this->house = $house; 
    } 
} 

$house = new House(); 
$door = new Door($house); 
+0

ありがとうございます。それは多くの助けとなりました。私は家のコンストラクタを変更しただけです。私は家のない家が好きではないからです。そこでHouseのコンストラクタで$ this-> doors [] = new FrontDoor($ this)を追加しました。 –

+0

この場合、HouseコンストラクタにFrontDoor: 'public function __construct(FrontDoor $ frontDoor)'を要求させることもできます。これは、あなたが与えることなく新しい家を作ることができないため、それはFrontDoor :) – martindilling

+0

それはあなたが私が書いた例で問題に遭遇するだろうが、あなたが家なしでドアを作成することはできませんし、ドアなしで家を作成することはできません;依存関係の方向性 – martindilling

関連する問題