- Когда следует
implement
илиextend
использовать? - Какие есть примеры из реального мира?
Это правильно?
Реализация , по-видимому, является способом обеспечить наличие определенных методов в классе и правильность форматирования вызовов функций этих методов. Однако реализация - это не способ передачи переменных или «настроек» классу?
Ожидаемый сценарий из реальной жизни: у меня есть платформа электронной коммерции с несколькими классами оплаты, которые следуют одному дизайну. Когда должен быть добавлен новый класс оплаты, очень легко следовать определенному дизайну, interface
чтобы гарантировать, что все мелочи присутствуют с самого начала.
Расширяющиеся классы заставляют расширенный (дочерний?) Класс наследовать все от своего родительского класса, кроме методов и переменных, объявленных как private
?
Ожидаемый сценарий из реальной жизни: у меня есть один вызываемый класс sessions
с двумя дочерними классами с именами sessioncookies
и databasesessions
. sessioncookies
и databasesessions
вместе наследуют ряд взаимных параметров конфигурации от своих родительских сеансов, что упрощает изменение параметра конфигурации, чтобы повлиять на все виды возможного хранилища данных посетителей.
Ответы:
Наследование полезно для уменьшения объема кода, который вы переписываете. Если у вас есть несколько классов с несколькими общими методами или полями, вместо того, чтобы определять эти методы и поля снова и снова, вы можете разделить их на базовый класс и сделать так, чтобы каждый из дочерних классов расширял этот базовый класс.
Интерфейсы (и
implements
) полезны, когда вы хотите определить общий протокол того, как должна вести себя группа объектов. Например, вы можете потребовать, чтобы сопоставимые объекты можно было сравнивать на равенство, хеширование и т. Д.В конечном итоге использование наследования - это выбор дизайна. Будьте внимательны, если вы определяете одни и те же методы в нескольких классах; это отличные случаи, когда вы можете выделить эти методы в базовый класс. То же самое касается классов, которые наблюдают некоторые из одинаковых характеристик: вы можете гарантировать согласованность, поместив эти характеристики в интерфейс, который будет реализован этими связанными классами.
Наследование - это большая концепция в ООП, которая выходит далеко за рамки PHP. Я рекомендую вам прочитать статью в Википедии о наследовании и, возможно, шаблонах проектирования от банды четырех .
Я считаю, что ваше понимание наследования в основном правильное. Следующим шагом будет его использование в производстве.
источник
Осуществлять:
Интерфейсы - это абстрактные классы, поэтому вы можете только объявлять вещи. Класс реализует интерфейс. Вы можете реализовать несколько интерфейсов.
Расширить:
Вы расширяете классы, когда вам нужна более конкретная версия класса.
Пример:
// Contract: a pet should play public interface Pet { public void play(); } // An animal eats and sleeps class Animal { public void eat(); public void sleep(); } public class Camel extends Animal { } public class Dog extends Animal implements Pet { public void play() {...} }
И Верблюд, и Собака - животные, поэтому они расширяют
Animal
класс. Но только собака является специфическим видом изAnimal
что также может бытьPet
источник