2016-05-29 23 views
0

私は次のシナリオを持っている:PHP抽象クラスとインタフェース

abstract class Contractor { 
    // Generic contractor methods...   
    } 

    abstract class PrivatePerson extends Contractor { 
    // Adds methods specific to private contractors 
    } 

    abstract class Company extends Contractor { 
    // Adds methods specific to Company contractors 
    } 

    class CustomerPrivate extends PrivatePerson { 
    // Customers that are contractors, but physical persons 
    } 

    class CustomerCompany extends Company { 
    // Customers that are contractors, but companies 
    } 

と同じことが、民間人や企業することができサプライヤー・販売店、で発生します。ここでの問題は、CustomerPrivateクラスとCustomerCompanyのオブジェクトを、同時にCustomerクラス(私がまだ定義していないクラス)と同じサプライヤとディーラーに強制する方法です。このような場合にインターフェイスを使用するのは良い習慣ですか?

interface Customer { 
    } 

    class PrivateCustomer extends PrivatePerson implements Customer { 
    // Customers that are physical persons, but are CUSTOMERS! 
    } 

ありがとうございました!

答えて

0

METHOD 1

class CustomerPrivate extends PrivatePerson 
{ 
    public function __construct() 
    { 
     if($this instanceof Customer) 
     { 
      //CODE 
     } 
     else 
     { 
      throw new \Exception("YOU ERROR MESSAGE", 1); 
      # code... 
     } 
    } 
} 

METHOD 2

$obj = new CustomerPrivate(); 

if ($obj instanceof Customer) 
{ 
    //CODE 
} 
else 
{ 
    # code... 
} 

あなたは

編集したい任意のクラスのためにこれを行うことができます

あなたが

interface Customer 
{ 
} 

class PrivateCustomer extends PrivatePerson implements Customer 
{ 
    // Customers that are physical persons, but are CUSTOMERS! 
} 

OR

を掲載さはい、あなたがあなたのインターフェイス、あなたが特性を使用することができます。 形質は非常に柔軟ですが、彼らは唯一のPHP 5.4でサポートされているか、EDIT

trait Customer 
{ 

} 

class PrivateCustomer extends PrivatePerson 
{ 
    use Customer; //trait customer 
    use OtherTrait; 

    // Customers that are physical persons, but are CUSTOMERS! 
} 

高い2

があなたのシナリオに依存あなたの問題を解決するための異なるアルゴリズムがあります。私は全体のシナリオを想像することはできませんが、あなたの質問から。 2つの異なるツリー(PersonとCompany)でCustomerタイプを共通にしたいとします。この場合、線形階層が問題であるため、このようなものを使用している可能性があります。

abstract class Contractor 
{ 
    public function isCustomer() 
    { 
     return FALSE; 
    } 
} 


trait Customer 
{ 
    public function isCustomer() 
    { 
     return TRUE; 
    } 
} 

class CustomerCompany extends Company 
{ 
    \\use Customer; 

    public function __construct() 
    { 
     if(!$this->isCustomer()) 
     { 
      throw new \Exception('ERROR', 1); 
     } 
    } 
} 
+0

しかし、クラスCustomerPrivateのオブジェクトは、どのように同時に顧客のインスタンスになることができますか?顧客クラスをどのように定義する必要がありますか? – mlattari

+0

ありがとうございました!あなたは私をたくさん助けました。 – mlattari

+0

私は形質で試しましたが、問題によって部分的に解決します。私はオブジェクトの特性のプロパティとメソッドを使用することができますが、オブジェクトは特性のインスタンスではありません....インターフェイスと私は逆の状況があります;-) – mlattari

0

OK。私はついにそれを得ました!

Trait CustomerTrait { 

    } 

    interface Customer {  

    } 

    class CustomerCompany extends Company implements Customer { 

     use CustomerTrait; 
    } 

    class CustomerPrivate extends ContractorPrivate implements Customer { 

     use CustomerTrait; 
    } 
関連する問題