Інтерфейс проти абстрактного класу проти класу бетону

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

проти

Ява, будучи об'єктно-орієнтованою мовою, дає вам блаженство писати свій код у формі класів багаторазового використання. Тепер як слово багаторазове був використаний, він існує з певної причини. Повторне використання коду не починається зі створення об’єктів з класів, воно починається ще до цього; поки ви самі створюєте класи.

Отже, ми маємо клас Interface, Abstract і Concrete.

PS: Інтерфейс - це не клас.

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

Декларація схожа на клас, але всередині інтерфейсу є кілька суворих правил, яких потрібно дотримуватися:

  • Усі методи, які ви заявляєте в інтерфейсі, можуть мати модифікатори «статичний», «за замовчуванням» або «абстрактний» (починаючи з Java 8). Неявно вони є "публічним рефератом".
  • З Java 8 методи можуть бути реалізовані (можуть мати тіло коду) в інтерфейсі, лише якщо він оголошений статичним або за замовчуванням. Абстрактні методи не можуть мати тіла; все, що вони можуть мати, - це підпис методу, як показано в прикладі вище.
  • Змінні в інтерфейсі заборонені. Отже, будь-яка декларація даних є «загальнодоступним статичним фіналом»; звідси лише константи.
  • Інтерфейси можуть розширюватися інші інтерфейси (один або кілька), але не класи (абстрактні чи ні).
  • Інтерфейси не можуть бути створені, оскільки вони не є конкретними класами.
  • Методи та константи не можна оголосити "приватними", методи не можна оголосити "остаточними".

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

Правила декларування такі:

  • Клас може бути абстрактним класом, не маючи в ньому жодних методів. Але якщо в ньому є якісь методи, він повинен мати принаймні один абстрактний метод. Це правило не застосовується до статичних методів.
  • Оскільки абстрактні класи можуть мати як абстрактні, так і не абстрактні методи, отже, тут необхідний модифікатор абстрактних (на відміну від інтерфейсу, де дозволені лише абстрактні методи).
  • Статичні члени дозволяються.
  • Абстрактні класи можуть розширювати інші щонайбільше один абстрактний або конкретний клас і реалізовувати кілька інтерфейсів.
  • Будь-який клас, який не реалізує всіх абстрактних методів свого суперкласу, повинен бути самим абстрактним класом.

Бетонні класи - це звичайні речі, з якими точно стикався кожен програміст Java. Це як остаточна реалізація проекту, якщо ви розширюєте його абстрактним суперкласом. Бетонний клас є повним сам по собі і може поширюватися і може бути розширений будь-яким класом.

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

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

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

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

Знання, якими не ділиться, марно витрачаються - клан Джейкобс