Тип параметра расширяемого метода абстрактного класса php или тип подсказки типа - PullRequest
0 голосов
/ 24 сентября 2018

Рассмотрим этот случай, у меня есть абстрактный класс, дети которого берут план и выполняют с ним различные действия.Теперь у меня есть несколько классов, которые расширяют это и выполняют немного разные действия с планом, поэтому у меня есть расширенные версии указанного плана, которые мне нужны для каждого дочернего класса.

Как таковой, я хочу определить /подсказка type свойство или соответствующее свойство input функции в абстрактном классе как любое, а затем укажите тип свойства в каждом из дочерних классов.

Но я не могу этого сделать, потому что PHP 7 выдает мне ошибку

Declaration B::setBlueprint() must be compatible with A::setBlueprint()

Классы чертежей

class Blueprint {
    public $id;
}

class ChildBlueprint extends ParentBlueprint {
    public $someOtherPropINeedOnlyInThisClass;
}

и абстрактные классы, которые используют эти чертежи

abstract class A {
    abstract public function setBlueprint( ParentBlueprint $_ );
}

class B extends A {
    public function setBlueprint( ChildBlueprint $_ ) {}
}

Я имею в виду, что мне нужен план, полученный из всех классов A, B, C, ..., X, Y, и поэтому нет смысла оставлять его вне абстрактногокласс.

Каковы хорошие решения ООП для этой проблемы?

1 Ответ

0 голосов
/ 24 сентября 2018

Вы можете преодолеть это с помощью инверсии зависимостей:

interface Blueprint {
}

class ParentBluePrint implements Blueprint
{
    public $id;
}

class ChildBluePrint extends ParentBlueprint
{
    public $id;
}

abstract class A
{
    abstract public function setBlueprint( Blueprint $_ );
}

class B extends A
{
    public function setBlueprint( Blueprint $_ ) {}
}

Подробнее о соответствующем принципе SOLID здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...