Для тих, хто почитав і зрозумів, як робити інтерфейси, але не зрозумів, навіщо.
Коли мова заходить про принципи об'єктно-орієнтованого програмування (ООП): поліморфізм, наслідування та інкапсуляція, корисно наводити аналогії з реального світу. Великий плюс ООП у тому, що ми в програмі можемо змоделювати частину реального всесвіту.
Змоделюємо сім'ю Іванових: Тато, Мама і хлопчик Петро. Від Тата Петро успадкував звичку прихлюпувати, коли п'є чай, а від Мами він успадкував звичку піджимати губи під час читання. Якщо спробувати реалізувати цю ситуацію в програмі, то у нас вийдуть три класи:
Щоб обійти це «не можна», в Java є інтерфейси. І для звичок ми придумаємо свій інтерфейс. Навіть два:
Виглядатимуть вони так:
Сенс інтерфейсів тепер має бути зрозумілим – у Java за допомогою інтерфейсів можна реалізувати множинне наслідування.
Якщо розвивати ситуацію далі, наприклад: адже у Тата і Мами напевно є звички, які вони не передали Петру, та й у Петра можуть з'явитися свої особисті звички. Як цю життєву Санта-Барбару перенести в площину Java ви дізнаєтеся у наступних серіях.
Це не єдиний приклад для розуміння інтерфейсів. Якщо не читали наступні статті, то обов'язково прочитайте:
Інтерфейси в Java (якщо не відкрито, можна вийти з профілю або прочитати в режимі - інкогніто)
Для чого в Java потрібні інтерфейси - тут реалізуйте всі приклади зі статті та змінюйте методи і в інтерфейсах, і в класах: назви методів, сигнатури (те, що метод приймає на вхід), типи виводу методів.
Розберіться самостійно:
- з різницею при імплементації інтерфейсу з класом та абстрактним класом;
- дефолтними методами.
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 не можна реалізувати множинне наслідування класів. До речі, у C++ це можна, а от у 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 потрібні інтерфейси - тут реалізуйте всі приклади зі статті та змінюйте методи і в інтерфейсах, і в класах: назви методів, сигнатури (те, що метод приймає на вхід), типи виводу методів.
Розберіться самостійно:
- з різницею при імплементації інтерфейсу з класом та абстрактним класом;
- дефолтними методами.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ