Нещодавно я почав обертати голову навколо ООП, і зараз я перебуваю до того, що чим більше я читаю про відмінності між абстрактними класами та інтерфейсами, тим я більше плутаюся. Поки що це неможливо уявити. Інтерфейси - це більш-менш структурні креслення, які визначають скелет, а реферати відрізняються тим, що можуть частково реалізувати код.
Я хотів би дізнатися більше про це через свою конкретну ситуацію. Ось посилання на моє перше запитання, якщо ви хочете трохи більше довідкової інформації: Яка хороша модель дизайну для мого нового класу?
Ось два класи, які я створив:
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()
які є загальними для моїх класів. Я також додав інші класи Автомобілі та Домашні тварини, які мають всі загальні методи і, звичайно, властивості, характерні для цих класів (наприклад, пробіг, вага).
Тепер я порушив принцип DRY, і я керую і змінюю той самий код у кількох файлах. Я маю намір мати більше класів, як човни, коні чи що завгодно.
Тож тут я б використовував інтерфейс або абстрактний клас? З того, що я розумію про абстрактні класи, я б використав супер клас як шаблон із усіма загальними елементами, вбудованими в абстрактний клас, а потім додав би лише ті пункти, які спеціально потрібні в майбутніх класах. Наприклад:
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(){ }
}
Або я б використовував інтерфейс і, оскільки вони настільки схожі, створити структуру, яку кожен з підкласів змушений використовувати з міркувань цілісності, і залиште її до кінця розробника, який складе цей клас, щоб відповідати за кожен із подробиці навіть загальних функцій. я думаю, що деякі «загальні» функції в майбутньому, можливо, потребують налаштування для потреб конкретного класу.
Незважаючи на все вищесказане, якщо ви вважаєте, що я зовсім нерозумію, що і чому абстрактні класи та інтерфейси, то, будь-ласка, нехай справжня відповідь перестане думати в цьому напрямку та запропонувати правильний шлях рухатися вперед!
Спасибі!