У меня проблема с дизайном кода моего проекта.
Например:
У меня есть два модельных класса: AClass
а также BClass
который extends
от CClass
учебный класс.
Для каждого из этого класса у меня есть два уровня обслуживания: AService
а также BService
в котором у меня есть методы:
create(AClass $object)
а также create(BClass $object)
соответствующий.
Так что я хочу. Я хочу создать Abstract Service CService
в котором у меня есть абстрактный класс create(CClass class)
, И мой AService
а также BService
должен extends
отCService
,
Но в 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
}
}
Я думаю, что теперь пример более легко увидеть. Так что в этом случае есть совместимая проблема.
Прежде всего, извинения, если это не так именно так что вы хотите — поскольку вы удалили все имена классов и просто перешли на 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
это должно быть в обоих AClass
а также BClass
т.е. если CClass::something
ожидает, что сможет позвонить $class->all()
тогда вы можете определить public function all();
в DInterface
и PHP выдаст ошибку, если либо AClass
или же BClass
не реализует это.
Других решений пока нет …