Привет Столкнулся с проблемой как правильно реализовать семейство классов птицы, проблема с классом курицы, тк они летать не могут, но не реализовывать же в каждом классе отдельно метод fly ? была идея все методы вынести в базовый класс, но проблема не только с курицами, какието птицы умеют петь, какието умеют плавать, а другие не умеют, везде ставить проверки конечно не вариант, хотелось бы использовать полиморфизм, те не разбираться с каждым обьектом когого класса это экземпляр, как можно решить эту проблему ? Простая иерархия выглядит так: PHP: 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(); }
PHP: class Bird { protected $fly = "I can fly"; public function __call($n, $a) { if(isset($this->$n)){ return $this->$n; } return FALSE; } } class Eagle extends Bird { } class Chicken extends Bird { protected $fly = 'I cant fly'; } $birds = [new Eagle(), new Chicken(), new Eagle()]; foreach ($birds as $bird) { echo $bird->fly(); }
причек нужно структурировать на уровне БД, а не иерархию классов писать для этого) передайте преподавателю, что нужно давать задания более приближенные к реальности
Не наследовать курицу от Bird, а создать класс BirdThatCantFly, в котором переопределить метод fly. --- Добавлено --- P.S. Тема, конечно, именно для профи...
можно забить на учебу, прийти на форум и спросить "профи". копипаста форева! (реально это не помогает, но попытки не прекращаются) петухи, кстати, летают. только быстро устают.
Курицам перья режут что бы не летали. Пингвины вот не могут. Решение только наследование: PHP: class Bird {} class FlyingBird extends Bird { function fly() {} } class FlightlessBird extends Bird {} class Penguin extends FlightlessBird {} class Parrot extends FlyingBird {}
да вот хyй знает утиная это когда я могу в одну функцию передать то, что соответствует интерфейсу летателя, в другую то, что интерфейсу ходителя, а в третью то, что имеет метод "плавать" и соответствует интерфейсу плавателя. А тут хз как быть.
Ну фиг знает PHP: function setBird($bird) { } setBird('parrot'); setBird(new Parrot); --- Добавлено --- Слушай почему у меня х*й поменялся на фиг, а у тебя нет
мастерство приходит с опытом я даже вот так могу http://php.net/manual/en/function.password-hash.php а у тебя скорее всего получится только вот так https://php.ru/manual/function.password-hash.html
фиг знает --- Добавлено --- блин опять --- Добавлено --- я понял --- Добавлено --- xуй --- Добавлено --- во
это кстати банально "слабая" типизация, а не утиная утиная это когда Код (Text): interface Swimmer { swim () } func inWater(animal Swimmer) { animal.swim() } interface Walker { walk() } func onGround(animal Walker) { animal.walk() } class Penguin { func walk() { /* walking code */ } func swim() { /* swimming code */ } } bird = new Penguin() onGround(bird) inWater(bird) --- Добавлено --- а ты приходи на сходку, мы там и тебя модератором сделаем только вазелин захвати, советую.
ну я условно написал. да, суть в том, что похер. ты просто говоришь, что вот интерфейс, и вот переменная типа этот интерфейс. т.е. хочу чтобы у объекта были такие-то и сякие-то методы. на остальное тебе насрать. Если что-то попало внутрь такой функции, то оно прошло через этот фильтр и имеет все нужные тебе методы. при этом сам класс может ничего ни от кого не наследовать.