JavaRush /Java блог /Random UA /Навіщо потрібні інтерфейси?
Павел
11 рівень

Навіщо потрібні інтерфейси?

Стаття з групи Random UA
Навіщо потрібні інтерфейси? Навіщо потрібне успадкування інтерфейсів? Навіщо потрібний поліморфізм? Для тих, хто почитав і зрозумів, як робити інтерфейси, але не зрозумів навіщо.

Дисклеймер: У цій статті та наступних, неймінги класів та методів будуть наведені російською мовою.

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