Добрый день. Подскажите, пожалуйста, вариант правильного проектированния подобной архитекруты или или помогите определиться с паттерном.
Нужно реализовать подобную архитектуру классов. Ествественно, сейчас это реализовано с ошибкой, но смысл понятен. Нужно, чтобы каждый конкретный класс принимал в качестве аргумента экземпляр соответсвующего класса.
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?';
}
}
Заранее спасибо.