Недавно я начал изучать ООП, и теперь я нахожусь в такой ситуации, что чем больше я читаю о различиях между абстрактными классами и интерфейсами, тем больше я запутываюсь. Пока что ни один из них не может быть создан. Интерфейсы - это более или менее структурные чертежи, определяющие структуру и тезисы, которые отличаются частичной реализацией кода.
Я хотел бы узнать больше об этом через мою конкретную ситуацию. Вот ссылка на мой первый вопрос, если вы хотите немного больше справочной информации: Какая модель дизайна подходит для моего нового класса?
Вот два класса, которые я создал:
class Ad {
$title;
$description
$price;
function get_data($website){ }
function validate_price(){ }
}
class calendar_event {
$title;
$description
$start_date;
function get_data($website){ //guts }
function validate_dates(){ //guts }
}
Итак, как видите, эти классы практически идентичны. Здесь не показано, но есть и другие функции like get_zip()
, save_to_database()
общие для всех моих классов. Я также добавил другие классы автомобилей и домашних животных, которые имеют все общие методы и, конечно, свойства, характерные для этих классов (например, пробег, вес).
Теперь я нарушил принцип СУХОГО, и я управляю и изменяю один и тот же код в нескольких файлах. Я намереваюсь иметь больше классов, таких как лодки, лошади или что-то еще.
Так это где я бы использовал интерфейс или абстрактный класс? Из того, что я понимаю об абстрактных классах, я бы использовал суперкласс в качестве шаблона со всеми общими элементами, встроенными в абстрактный класс, а затем добавил бы только те элементы, которые конкретно необходимы в будущих классах. Например:
abstract class content {
$title;
$description
function get_data($website){ }
function common_function2() { }
function common_function3() { }
}
class calendar_event extends content {
$start_date;
function validate_dates(){ }
}
Или я бы использовал интерфейс и, поскольку они очень похожи, создал бы структуру, которую каждый из подклассов вынужден использовать по соображениям целостности, и оставил это на усмотрение конечного разработчика, который конкретизирует этот класс, чтобы отвечать за каждый из детали даже общих функций. я думаю, что некоторые «общие» функции, возможно, придется изменить в будущем для нужд своего конкретного класса.
Несмотря на все вышесказанное, если вы считаете, что я неправильно понимаю, что и почему абстрактных классов и интерфейсов в целом, непременно дайте правильному ответу перестать думать в этом направлении и предложите правильный путь для продвижения вперед!
Благодарность!