2016-05-29 13 views
0

Ich habe folgendes Szenario:php abstrakte Klassen und Schnittstellen

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 
    } 

Und das gleiche geschieht mit Lieferanten und Händlern, die Privatpersonen oder Unternehmen sein kann. Das Problem ist nun das folgende: Wie kann man das Objekt der Klasse CustomerPrivate und CustomerCompany gleichzeitig von der Klasse Customer (die ich noch nicht definiert habe) erzwingen und das gleiche für Lieferanten und Händler. Es ist eine gute Praxis, in einem solchen Fall Schnittstellen zu verwenden?

interface Customer { 
    } 

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

Danke für jeden Vorschlag!

Antwort

0

VERFAHREN 1

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

METHODE 2

$obj = new CustomerPrivate(); 

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

Sie dies für jede Klasse tun können Sie

EDITED

Ja, Sie können Sie Schnittstellen, wie Sie

geschrieben
interface Customer 
{ 
} 

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

ODER

Sie können Züge benutzen. Traits sind sehr flexibel, aber sie sind nur in PHP 5.4 oder höher

trait Customer 
{ 

} 

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

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

EDIT 2

Es gibt verschiedenen Algorithmus für die Lösung Ihrer Probleme unterstützt, die auf Ihrem Szenario ab. Ich kann mir das ganze Szenario nicht vorstellen, aber von deiner Frage. Sie möchten, dass der Kundentyp in zwei verschiedenen Baumstrukturen (Person und Firma) verwendet wird. In diesem Kontext ist die lineare Hierarchie ein Problem, also hätte ich vielleicht so etwas verwenden können.

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

Aber wie können Objekte der Klasse CustomerPrivate gleichzeitig Instanzen des Kunden sein? Wie soll ich dann die Klasse Kunde definieren? – mlattari

+0

Vielen Dank! Sie haben mir sehr geholfen. – mlattari

+0

Ich habe es mit Eigenschaften versucht, aber es löst teilweise durch Problem. Ich kann die Eigenschaften und Methoden in den Eigenschaften für die Objekte verwenden, aber die Objekte sind keine Instanzen der Eigenschaften .... Mit Schnittstellen habe ich die umgekehrte Situation ;-) – mlattari

0

OK. Ich habe es endlich!

Trait CustomerTrait { 

    } 

    interface Customer {  

    } 

    class CustomerCompany extends Company implements Customer { 

     use CustomerTrait; 
    } 

    class CustomerPrivate extends ContractorPrivate implements Customer { 

     use CustomerTrait; 
    } 
Verwandte Themen