Коли впроваджувати та продовжувати? [зачинено]


90
  • Коли слід implementабо extendзастосовувати?
  • Які є реальні приклади?

Це правильно?

Здається, реалізація - це спосіб забезпечити існування певних методів у класі та належне форматування цих викликів функцій. Впровадження - це не спосіб передачі змінних чи "налаштувань" класу?

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

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

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


1
Я рекомендую вам прочитати про спадщину.
Рейф Кетлер

Відповіді:


64

Спадщина корисна для зменшення кількості коду, який ви переписуєте. Якщо у вас є кілька класів з кількома загальними методами або полями, замість того, щоб визначати ці методи та поля знову і знову, ви можете їх врахувати до базового класу і попросити кожен з дочірніх класів розширити цей базовий клас.

Інтерфейси (та implements) корисні, коли ви хочете визначити загальний протокол щодо поведінки групи об’єктів. Наприклад, можливо, ви захочете доручити порівняння об’єктів, які можна порівняти, для рівності та хешування тощо.

Використання спадщини - це зрештою вибір дизайну. Слідкуйте за випадками, коли ви визначаєте однакові методи в кількох класах; це чудові випадки, коли ви можете перевести ці методи на базовий клас. Те саме стосується класів, які дотримуються одних і тих же характеристик: ви можете гарантувати послідовність, помістивши ці характеристики в інтерфейс, який повинен бути реалізований цими пов'язаними класами.

Спадщина - це велика концепція ООП, яка виходить далеко за рамки просто PHP. Я рекомендую вам прочитати статтю Вікіпедії про успадкування та, можливо, Шаблони дизайну, створені Бандою Чотирьох .

Я вважаю, що ваше розуміння спадщини в основному правильне. Наступним кроком буде використання його у виробництві.


4
Зараз багато людей вважають книгу "Банда чотирьох" надто важкою з точки зору матеріалу як вступ до шаблонів дизайну. Популярною альтернативою є Head First: Design Patterns, яка полегшує читання. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan

1
"Будьте уважні до випадків, коли ви визначаєте однакові методи для кількох класів; це чудові випадки, коли ви можете розкласти ці методи на базовий клас." Чи матиме розширення класу перевагу порівняно з використанням Trait для визначення цих методів?
Даніель Вайнер

1
"Спадкування корисно для зменшення кількості коду, який ви переписуєте" - метою успадкування є спільна поведінка, а не код. Де це можливо, риси - це спосіб ділитися кодом, а не розширювати абстрактний клас конкретними класами, які в іншому випадку не мають нічого спільного. Зазвичай ви можете моделювати свої класи як взаємозв'язки, а не відносини, що також сприятиме повторному використанню коду та поліморфізму.
Дункан

12

Реалізація:

Інтерфейси - це абстрактні класи, тому ви можете лише оголошувати речі. Клас реалізує інтерфейс. Ви можете реалізувати кілька інтерфейсів.

Розширити:

Ви розширюєте класи, коли вам потрібна більш конкретна версія класу.

Приклад:

// 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.