@vrazbros

Как лучше реализовать иерархию классов птицы и метод летать?

Привет

Столкнулся с проблемой как правильно реализовать семейство классов птицы, проблема с классом курицы, тк они летать не могут, но не реализовыватьже в каждом классе отдельно метод fly ? И

abstract class Bird
{
    abstract public function fly();
}

class Eagle extends Bird
{
    public function fly()
    {
        echo "I can fly";
    }
}

class Chicken extends Bird
{
    public function fly()
    {
        // What to do here ?
        die('I cant fly Error');
    }
}

$birds = [new Eagle(), new Chicken(), new Eagle()];

foreach ($birds as $bird) {
    echo $bird->fly();
}
  • Вопрос задан
  • 426 просмотров
Пригласить эксперта
Ответы на вопрос 3
@TheLostRoot
C# ASP.NET developer
Интерфейс использовать как раз такой случай.
Все кто умеют летать должны реализововать интерфейс IFlyable
Ответ написан
Комментировать
@BorisKorobkov Куратор тега PHP
Web developer
Вариант 1.
Bird:
public function fly() { echo 'I can fly', PHP_EOL;  }

Chicken:
public function fly() { echo 'I can not fly', PHP_EOL;  }


Вариант 2.
Eagle, Duck:
public function fly() { echo 'I can fly', PHP_EOL;  }

Chicken:
public function fly() { echo 'I can not fly', PHP_EOL;  }


Вариант 3.
FlyBird:
public function fly() { echo 'I can fly', PHP_EOL;  }

Eagle, Duck extends FlyBird
Chicken:
public function fly() { echo 'I can not fly', PHP_EOL;  }


Вариант 4.
trait FlyBird:
public function fly() { echo 'I can fly', PHP_EOL;  }

Eagle, Duck use FlyBird
Chicken:
public function fly() { echo 'I can not fly', PHP_EOL;  }
Ответ написан
Комментировать
@red-barbarian
Посмотрите в сторону шаблона Стратегия.
Летание это довольно динамическое свойство. Даже может меняться а процессе жизни объекта. Поэтому это свойство чаще всего полезнее выносить за объект. И присваивать полю "летание" некую реализацию из вне.
Например
Ласточка летает одним методом. Птенцы и курицы другим. И т. д.
Наследование довольно жесткая связь. Ее стоит избегать. Если это возможно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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