【问题标题】:Overloarding methods in phpphp中的重载方法
【发布时间】:2014-09-16 09:46:29
【问题描述】:

我在设计项目代码时遇到问题。

例如:

我有两个模型类:AClassBClass 其中 extends 来自 CClass 类。 对于每个此类,我有两个服务层:AServiceBService,其中我有方法:

create(AClass $object)create(BClass $object)对应。

所以我想要什么。我想创建Abstract Service CService,其中我有抽象类create(CClass class)。而我的AServiceBService 必须extends fromCService。 但是在PHP 我不能这样做,因为它因兼容异常而失败。

所以也许有一些想法可以解决这个问题?

更新: 上面的例子可能不是很好,所以我给你看一个真实的例子:

abstract class Contract
{
    protected $id;
    protected $owner
}

class FundTraderContract extends Contract
{
    private $fundContract;
}

class InvestorTraderContract extends Contract
{
    private $investmentContract;
}

abstract class ContractService 
{
    abstract function create(Contract $contract){}
}

class FundTraderContractService extends ContractService
{
    public function create(FundTraderContract $contract)
    {
        //some logic
    }
}


class InvestorTraderContractService extends ContractService
{
    public function create(InvestorTraderContract $contract)
    {
        //some logic
    }
}

我认为现在的例子更容易看到。所以在这种情况下存在兼容问题。

【问题讨论】:

  • 我欢迎我们的新方法过载。 ;)
  • 仅供参考,你不是第一个问这个的人,例如见stackoverflow.com/q/19429089/476。让两个类层次结构基本上并行并不真正起作用,不仅仅是在 PHP 中。我对这个设计解决方案很感兴趣。

标签: php abstract-class parent-child overloading


【解决方案1】:

首先,如果这不是您想要的完全,我们深表歉意 - 因为您已经剥离了所有的类名,只是去了 AClass 等,所以很难真正理解您的逻辑应用。


http://en.wikipedia.org/wiki/Dependency_inversion_principle

创建一个接口。在不知道你的实际类的情况下,不可能给它一个有意义的名字,但你可以这样做:

interface DInterface {  }

class AClass implements DInterface {  }
class BClass implements DInterface {  }

class CClass
{
    public function something(DInterface $class) {  }
}

然后您可以在DInterface 中定义应该在AClassBClass 中的内容,即。如果CClass::something 期望能够调用$class->all(),那么您可以在DInterface 中定义public function all();,如果AClassBClass 没有实现它,PHP 将出错。

【讨论】:

  • 可能还想对接口隔离发表评论
  • @Flosculus 物有所值,en.wikipedia.org/wiki/Interface_segregation_principle,但一口气吸收可能有点多:)
  • @Joe 因此,如果我在 DInterface 中定义 create(CClass $class),但在 AClass 中定义 create(AClass $class),我将遇到同样的错误。或者我有什么不明白的地方?
  • @AndreyKhodan 你能重写你的 OP 来解释你在“InvestorTraderContractService”等方面尝试做什么,而不是 AClass 和 BClass?这会容易得多:)
  • @AndreyKhodan 您使用的示例在 OOP 原则和现实中都违反了 ::create 的合同(oop 术语)。如果服务依赖于单独的具体实例,那么它们从根本上是不兼容的。这不一定是您的错误,只是这条路线可能不适合您。除非你能找到一种方法让它们只依赖于Contract
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多