繁体   English   中英

php抽象类和接口

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM