@ninjathrasher

Какое типовое решение применить в данной ситуации?

Добрый день. Подскажите, пожалуйста, вариант правильного проектированния подобной архитекруты или или помогите определиться с паттерном.

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

abstract class Animal
{
    abstract public function say();
}

class Wolf extends Animal
{
    public function say()
    {
        return 'woooof';
    }
}

class Bear extends Animal
{
    public function say()
    {
        return 'aaagrh';
    }
}


abstract class Hunter
{
    abstract public function hunt(Animal $animal);
}

class WolfHunter extends Hunter
{
    public function hunt(Wolf $wolf)
    {
        return 'where is a wolf?';
    }
}

class BearHunter extends Hunter
{
    public function hunt(Bear $bear)
    {
        return 'where is a bear?';
    }
}


Заранее спасибо.
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ответы на вопрос 1
vesper-bot
@vesper-bot
Любитель файрволлов
Здесь нарушен принцип L из SOLID-списка, функции hunt() должны принимать Animal на вход, и обрабатывать любой Animal (своим образом, но любой). А так, для объединения не связанных между собой классов правильно использовать интерфейсы - если оно требуется, т.е. нужно сделать типа var hunters:array of Hunter. (PHP вроде бы интерфейсы не умеет - тогда проверяйте через if ($animal is Wolf){...}) А если не нужно - реализуйте независимые пары классов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы