Игнорировать определенные методы при наследовании от классов - PullRequest
0 голосов
/ 26 февраля 2020

Я изучаю oop и практикую концепции с PHP. Я пытаюсь создать класс Human и класс Dog. Класс Human будет иметь два свойства: $name:string и $age:int. Класс Human объявляется первым, имея метод speak(). Моя проблема в том, что когда Dog расширяется от Humans, я хочу, чтобы в нем было все, начиная с Human, за исключением метода speak(), где он будет заменен уникальным методом bark(). Из того, что я искал, решение было бы установить speak() в private, тогда Dog не унаследует его. Однако при назначении Human на $person, speak() также недоступен, так как он является закрытым. Для меня это просто практика, чтобы понять oop. Что я должен делать с точки зрения лучших практик, если это было настоящее программное обеспечение? Опять же, я новичок в oop. Спасибо!

Вот мой код:

<?php

    class Human {
      public $name;
      public $age;

      public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
      }

      public function speak() {

      }
    }

    class Dog extends Human {
      public function bark() {

      }
    }

    $people = array();
    $dogs = array();

    array_push($dogs, new Dog("Rocky", 4));
    array_push($people, new Human("Carlos", 21));

    $people[0]->speak();
    $dogs[0]->bark();

?>

1 Ответ

0 голосов
/ 26 февраля 2020

С точки зрения OOP, это не имеет никакого смысла, что собака расширяет человека. Подумайте об этом, это просто не имеет никакого смысла. Что вы можете сделать, так это определить абстрактный класс или интерфейс, от которого расширяются и Dog, и Human. Как это:

abstract class Animal 
{
     abstract public function communicate();
     ...anyOtherMethods that are commom between dogs and Humans
}

class Human extends Animal 
{
     public function communicate()
     {
        echo 'speak';
     }
}

class Dog extends Animal
{

     public function communicate()
     {
        echo 'bark';
     }
}

(new Dog)->communicate(); // bark
(new Human)->communicate(); //speak

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...