[英]php abstract classes and interfaces
我有以下情况:
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!
}
感谢您的任何建议!
方法1
class CustomerPrivate extends PrivatePerson
{
public function __construct()
{
if( $this instanceof Customer )
{
//CODE
}
else
{
throw new \Exception("YOU ERROR MESSAGE", 1);
# code...
}
}
}
方法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!
}
要么
您可以使用特征。 特性非常灵活,但仅在PHP 5.4或更高版本中受支持
trait Customer
{
}
class PrivateCustomer extends PrivatePerson
{
use Customer; //trait customer
use OtherTrait;
// Customers that are physical persons, but are CUSTOMERS!
}
编辑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);
}
}
}
好。 我终于明白了!
Trait CustomerTrait {
}
interface Customer {
}
class CustomerCompany extends Company implements Customer {
use CustomerTrait;
}
class CustomerPrivate extends ContractorPrivate implements Customer {
use CustomerTrait;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.