@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
Посмотрите в сторону шаблона Стратегия.
Летание это довольно динамическое свойство. Даже может меняться а процессе жизни объекта. Поэтому это свойство чаще всего полезнее выносить за объект. И присваивать полю "летание" некую реализацию из вне.
Например
Ласточка летает одним методом. Птенцы и курицы другим. И т. д.
Наследование довольно жесткая связь. Ее стоит избегать. Если это возможно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
23 апр. 2024, в 16:55
10000 руб./за проект
23 апр. 2024, в 16:10
1500 руб./в час
23 апр. 2024, в 16:05
3000 руб./за проект