Когда внедрять и расширять? - PullRequest
79 голосов
/ 10 февраля 2011
  • Когда следует использовать implement или extend?
  • Какие примеры из реальной жизни?

Это правильно?

Реализация , по-видимому, является способом обеспечения того, что определенные методы существуют в классе, и что эти вызовы функций методов правильно отформатированы. Реализация не способ передачи переменных или «настроек» в класс?

Ожидаемый сценарий из реальной жизни: У меня есть платформа электронной коммерции с несколькими классами платежей, которые имеют одинаковый дизайн. Когда должен быть добавлен новый класс платежей, действительно легко следовать определенному дизайну interface, чтобы убедиться, что все биты и кусочки присутствуют с самого начала.

Расширение классов заставляет расширенный (дочерний?) Класс наследовать все от своего родительского класса, кроме методов и переменных, объявленных как private?

Ожидаемый реальный сценарий: У меня есть один класс с именем sessions с двумя дочерними классами с именами sessioncookies и databasesessions. sessioncookies и databasesessions вместе наследуют ряд параметров взаимной конфигурации от своих родительских сеансов, что позволяет легко изменить параметр конфигурации, чтобы повлиять на все виды возможного хранения данных посетителей.

Ответы [ 2 ]

58 голосов
/ 10 февраля 2011

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

Интерфейсы(и implements) полезны, когда вы хотите определить общий протокол для поведения группы объектов.Например, вы можете потребовать, чтобы сопоставимые объекты можно было сравнивать на предмет равенства и хэширования и т. Д.

Использование наследования в конечном счете является выбором дизайна.Будьте внимательны к случаям, когда вы определяете одни и те же методы для нескольких классов;это отличные случаи, когда вы можете выделить эти методы в базовый класс.То же самое относится и к классам, которые имеют одни и те же характеристики: вы можете гарантировать согласованность, поместив эти характеристики в интерфейс, который будет реализован соответствующими классами.

Наследование - это большая концепция в ООП, которая выходит далеко за рамки простогоPHP.Я рекомендую вам прочитать статью в Википедии о наследовании и, возможно, Шаблоны проектирования бандой четырех .

Я считаю, что ваше понимание наследования в основном верно.Следующим шагом будет использование его в производстве.

3 голосов
/ 08 мая 2019

Реализовать:

Интерфейсы являются абстрактными классами, поэтому вы можете только объявлять вещи. Реализация предназначена для реализации интерфейса! Вы можете реализовать несколько интерфейсов.

Extend:

Вы расширяете классы, когда вам нужна более конкретная версия класса.

Пример:

abstract class Animal {
    private String name;

    public void eat();
    public void sleep();
}

public interface Pet {
    public void play();
}

public class Dog extends Animal implements Pet {
    public void eat() {
        // do stuff
    }

    public void sleep() {
        // do stuff
    }

    public void play() {
        // do stuff
    }
}

public class Hippo extends Animal {
    public void eat() {
        // do stuff
    }

    public void sleep() {
        // do stuff
    }
}

И Бегемот, и Собака расширяют звери, так как они оба животные. Но только Собака может быть домашним животным!

...