Навіщо потрібні інтерфейси? Навіщо потрібне успадкування інтерфейсів? Навіщо потрібний поліморфізм? Для тих, хто почитав і зрозумів, як робити інтерфейси, але не зрозумів навіщо.
Дисклеймер: У цій статті та наступних, неймінги класів та методів будуть наведені російською мовою.
Коли йдеться про принципи об'єктно-орієнтованого програмування (ООП): поліморфізм, успадкування та інкапсуляція, корисно наводити аналогії з реального світу. Великий плюс ОВП у тому, що ми у програмі можемо змоделювати частину реального всесвіту. Змоделюємо сім'ю Іванових: Папа , Мама та хлопчик Петя . Від Папи Петя успадкував звичку плескати коли п'є чай, а від Мами він успадкував звичку підтискати губи під час читання. Якщо спробувати реалізувати цю ситуацію в програму, то в нас вийдуть три класи:class Папа
class Мама
class Петя
У Папи та Мами є звички, які потрібно передати Петі . Звички - це якісь дії - так що найкраще реалізувати їх у програмному світі як методи: Спочатку Папа :
class Папа {
public void прихлюпывать() {
System.out.println("Хлюп");
}
}
Тепер Мама :
class Мама {
public void поджимать() {
System.out.println("Поджать губки");
}
}
Якщо йдеться про наслідування, то логічно написати код так:
class Петя extends Папа, Мама {
@Override
public void прихлюпывать() {
System.out.println("Хлюп");
}
@Override
public void поджимать() {
System.out.println("Поджать губки");
}
}
Тобто успадкувати Петю від Папи та Мами одночасно. Якщо так написати, то компілятор лаятиметься, тому що в Java не можна реалізувати множинне успадкування класів. До речі, в С++ можна, а ось у Java не можна, тому що з множинним успадкуванням можуть виникнути великі проблеми: докладно пишуть в інтернеті . Щоб обійти це «не можна», в Java є інтерфейси. І для навичок ми придумаємо свій інтерфейс. Навіть два: Виглядатимуть вони так:
public interface ПривычкиПапы {
public void прихлюпывать();
}
public interface ПривычкиМамы {
public void поджимать();
}
В інтерфейсі ми тільки описали звички, але не описали, що вони конкретно роблять, тому що конкретну реалізацію ми пропишемо в класах. Спочатку віддамо Папі та Мамі їхні законні звички.
class Папа implements ПривычкиПапы {
@Override
public void прихлюпывать() {
System.out.println("Хлюп");
}
}
class Мама implements ПривычкиМамы{
@Override
public void поджимать() {
System.out.println("Поджать губки");
}
}
І тепер, абсолютно легально можна передати Пете звички від Папи та Мами одночасно
class Петя implements ПривычкиПапы, ПривычкиМамы {
@Override
public void прихлюпывать() {
System.out.println("Хлюп");
}
@Override
public void поджимать() {
System.out.println("Поджать губки");
}
}
Тобто множинна реалізація (частіше кажуть імплементація) в Java цілком можлива. Сенс інтерфейсів тепер має бути зрозумілий - Java за допомогою інтерфейсів можна реалізувати множинне успадкування. Якщо розвивати ситуацію далі, наприклад: адже у Папи та Мами, напевно, є звички, які вони не передали Петі , та й у Петі можуть бути свої особисті звички. Як цю життєву Санта-Барбару перенести у площину Java ви дізнаєтесь у наступних серіях. Це не єдиний приклад для розуміння інтерфейсів. Якщо не читали наступні статті, то обов'язково прочитайте: Інтерфейси в Java (якщо не відкрито, можна вийти з профілю або прочитати в режимі – інкогніто) Для чого в Java потрібні інтерфейси - тут реалізуйте всі приклади зі статті і поміняйте способи і в інтерфейсах і в коласах: назви способів, сигнатури (те що спосіб приймає на вхід), типи виведення способів. Розберіться самостійно: - з різницею при імплементації інтерфейсу з класом та абстрактним класом; - Дефолтні методи.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ