За последние 24 часа нас посетили 22849 программистов и 1261 робот. Сейчас ищут 762 программиста ...

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

Тема в разделе "PHP для профи", создана пользователем asker234, 31 мар 2018.

  1. asker234

    asker234 Новичок

    С нами с:
    31 мар 2018
    Сообщения:
    4
    Симпатии:
    0
    Привет

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

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

    Простая иерархия выглядит так:
    PHP:
    1. abstract class Bird
    2. {
    3.     abstract public function fly();
    4. }
    5.  
    6. class Eagle extends Bird
    7. {
    8.     public function fly()
    9.     {
    10.         echo "I can fly";
    11.     }
    12. }
    13.  
    14. class Chicken extends Bird
    15. {
    16.     public function fly()
    17.     {
    18.         // What to do here ?
    19.         die('I cant fly Error');
    20.     }
    21. }
    22.  
    23. $birds = [new Eagle(), new Chicken(), new Eagle()];
    24.  
    25. foreach ($birds as $bird) {
    26.     echo $bird->fly();
    27. }
     
  2. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    PHP:
    1. public function fly()
    2.     {
    3.         return false;
    4.     }
     
  3. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Пингвинов жалко:(
     
  4. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    PHP:
    1. class Bird
    2. {
    3.     protected $fly = "I can fly";
    4.  
    5.     public function __call($n, $a)
    6.     {
    7.         if(isset($this->$n)){
    8.             return $this->$n;
    9.         }
    10.         return FALSE;
    11.     }
    12. }
    13. class Eagle extends Bird
    14. {
    15.  
    16. }
    17. class Chicken extends Bird
    18. {
    19.     protected $fly = 'I cant fly';
    20. }
    21. $birds = [new Eagle(), new Chicken(), new Eagle()];
    22. foreach ($birds as $bird) {
    23.     echo $bird->fly();
    24. }
     
    #4 Maputo, 31 мар 2018
    Последнее редактирование: 31 мар 2018
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Трейты.
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    композицию можно применить
    --- Добавлено ---
    Похожий пример кажется есть в книге Зандстры.
     
  7. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    причек нужно структурировать на уровне БД, а не иерархию классов писать для этого)
    передайте преподавателю, что нужно давать задания более приближенные к реальности
     
    askanim и Dimon2x нравится это.
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Не наследовать курицу от Bird, а создать класс BirdThatCantFly, в котором переопределить метод fly.
    --- Добавлено ---
    P.S. Тема, конечно, именно для профи...
     
    askanim нравится это.
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    анекдот про крокодила
     
  10. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    если хорошо пнуть - полетит...
     
    askanim, Deonis и TeslaFeo нравится это.
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    можно забить на учебу, прийти на форум и спросить "профи". копипаста форева!
    (реально это не помогает, но попытки не прекращаются)

    петухи, кстати, летают. только быстро устают.
     
  12. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    Курицам перья режут что бы не летали. Пингвины вот не могут. Решение только наследование:
    PHP:
    1. class Bird {}
    2.  
    3. class FlyingBird extends Bird {
    4.     function fly() {}
    5. }
    6. class FlightlessBird extends Bird {}
    7.  
    8. class Penguin extends FlightlessBird {}
    9. class Parrot extends FlyingBird {}
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    кстати ещё решение перейти на язык с утиной типизацией
     
    askanim и [vs] нравится это.
  14. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    В php кажется утиная типизация разве нет?
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    да вот хyй знает

    утиная это когда я могу в одну функцию передать то, что соответствует интерфейсу летателя, в другую то, что интерфейсу ходителя, а в третью то, что имеет метод "плавать" и соответствует интерфейсу плавателя. А тут хз как быть.
     
    Васяня нравится это.
  16. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    Ну фиг знает
    PHP:
    1. function setBird($bird) {
    2.  
    3. }
    4.  
    5. setBird('parrot');
    6. setBird(new Parrot);
    --- Добавлено ---
    Слушай почему у меня х*й поменялся на фиг, а у тебя нет o_O
     
  17. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    xyй его знает
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
  19. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    фиг знает
    --- Добавлено ---
    блин опять
    --- Добавлено ---
    я понял
    --- Добавлено ---
    xуй
    --- Добавлено ---
    во
     
    igordata нравится это.
  20. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Знаем мы какой у вас там опыт. Через постель все порешали теперь беспределите)
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    это кстати банально "слабая" типизация, а не утиная
    утиная это когда
    Код (Text):
    1. interface Swimmer {
    2.   swim ()
    3. }
    4.  
    5. func inWater(animal Swimmer) {
    6.   animal.swim()
    7. }
    8.  
    9. interface Walker {
    10.   walk()
    11. }
    12.  
    13. func onGround(animal Walker) {
    14.   animal.walk()
    15. }
    16.  
    17. class Penguin {
    18.   func walk() {
    19.     /* walking code */
    20.   }
    21.  
    22.   func swim() {
    23.     /* swimming code */
    24.   }
    25. }
    26. bird = new Penguin()
    27.  
    28. onGround(bird)
    29. inWater(bird)
    --- Добавлено ---
    а ты приходи на сходку, мы там и тебя модератором сделаем :D
    только вазелин захвати, советую.
     
  22. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    @igordata Не вижу описания animal, что это и от куда берётся или похер?
     
  23. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Уже столько лет в теме и все равно все как в первый раз? Жаркие бедняшки)
     
  24. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    блин animal это название переменной, а второе похоже тип :D
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ну я условно написал.

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

    при этом сам класс может ничего ни от кого не наследовать.