Когда внедрять и расширять?
- Когда следует использовать
implement
или extend
?
- Каковы некоторые реальные примеры?
Правильно ли это?
Реализация представляется способом обеспечения того, что определенные методы существуют в классе и что эти вызовы функций методов правильно отформатированы. Реализация не способа передачи переменных или "настроек" в класс, хотя?
Ожидаемый сценарий реальной жизни: у меня есть платформа для электронной коммерции, в которой есть несколько классов оплаты, которые следуют одному и тому же дизайну. Когда новый класс оплаты должен быть добавлен, очень легко следовать определенному дизайну interface
, чтобы убедиться, что все биты и куски находятся с самого начала.
Расширение классов заставляет расширенный (дочерний?) класс наследовать все от своего родительского класса, кроме методов и переменных, объявленных как private
?
Ожидаемый сценарий реальной жизни: у меня есть один класс под названием sessions
с двумя дочерними классами с именем sessioncookies
и databasesessions
. sessioncookies
и databasesessions
вместе наследуют ряд взаимных опций конфигурации из своих родительских сеансов, что упрощает изменение конфигурации, чтобы повлиять на всевозможные возможные хранилища данных для посетителей.
Ответы
Ответ 1
Наследование полезно для уменьшения объема переписываемого кода. Если у вас есть несколько классов с несколькими общими методами или полями, вместо того, чтобы определять эти методы и поля снова и снова, вы можете разложить их в базовый класс, и каждый из дочерних классов расширит этот базовый класс.
Интерфейсы (и implements
) полезны, когда вы хотите определить общий протокол поведения группы объектов. Например, вам может потребоваться сопоставить сопоставимые объекты на равенство и хэширование и т.д.
Использование наследования в конечном счете является выбором дизайна. Будьте внимательны к случаям, когда вы определяете одни и те же методы для нескольких классов; это отличные случаи, когда вы можете выделить эти методы в базовый класс. То же самое относится и к классам, которые имеют некоторые одинаковые характеристики: вы можете гарантировать согласованность, поместив эти характеристики в интерфейс, который будет реализован этими связанными классами.
Наследование - это большая концепция в ООП, которая выходит далеко за рамки простого PHP. Я рекомендую вам прочитать статью в Википедии о наследовании и, возможно, " Разработка шаблонов от банды четырех".
Я считаю, что ваше понимание наследования в основном правильно. Следующим шагом будет использование его в производстве.
Ответ 2
Реализация:
Интерфейсы являются абстрактными классами, поэтому вы можете только объявлять вещи. Класс реализует интерфейс. Вы можете реализовать несколько интерфейсов.
Расширение:
Вы расширяете классы, когда вам нужна более конкретная версия класса.
Пример:
// 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 Dog extends Animal implements Pet {
public void play() {...}
}
public class Camel extends Animal {
}
Верблюд и собака - животные, поэтому они расширяют класс Animal
. Но только собака может быть домашним животным!