User Павел
Павел
11 уровень

Зачем нужны интерфейсы?

Статья из группы Java Developer
Зачем нужны интерфейсы? Зачем нужно наследование интерфейсов? Зачем нужен полиморфизм? Для тех, кто почитал и понял как делать интерфейсы, но не понял зачем.

Дисклеймер: В этой статье и последующих, нейминги классов и методов будут приведены на русском языке.

Когда речь заходит о принципах объектно-ориентированного программирования (ООП): полиморфизм, наследование и инкапсуляция, полезно приводить аналогии из реального мира. Большой плюс ООП в том, что мы в программе можем смоделировать часть реальной вселенной. Смоделируем семью Ивановых: Папа, Мама и мальчик Петя. От Папы Петя унаследовал привычку прихлюпывать когда пьет чай, а от Мамы он унаследовал привычку поджимать губы во время чтения. Если попытаться реализовать эту ситуацию в программу, то у нас получиться три класса:

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 вы узнаете в следующих сериях.
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Иванов Дмитрий Уровень 18, Борисоглебск, Russian Federation
27 ноября 2021
Что-то я даже с данным примером не совсем понял суть интерфейсов 😐 Мы имплементируем привычки Мамы и Папы сыну Пете (ПривычкиПапы, ПривычкиМамы) И в этом же классе их переписываем @Override. Зачем?! Почему нельзя было сразу создать эти методы? Или если мы намерены их изменить на свой лад, тогда зачем вообще нужно было наследоваться?! Непонятно пока что совсем😞 Нужно попробовать на практике.
стасевич Уровень 19, Гомель, Беларусь
23 ноября 2021
есть шикарная книга на 300 страниц (тема ооп около 150 страниц) , после прочтение оной, вам всё станет понятно. Мэтт Вайсфельд "Объектно-ориентированное мышление"
Fleser Уровень 13, Днепр, Ukraine
22 ноября 2021
Спасибо большое за статью. Много где читал про интерфесы, но здесь очень наглядно описано.
Cipher Уровень 41, Днепр, Украина
22 ноября 2021
Сделано понятно и с юмором😅