Есть интерфейс с не реализованными методами, мы создаем класс обертку.
получается конструкция
public class Class implements Interface {
private Interface interface; что сюда ляжет? new Interface? вроде нельзя создать объект интерфейса же
Class (Interface interface) {
this.interface = interface;
}
metod () {
interface.metod(); а тут как? метод же не реализован
}
}
publbc interface Interface {
void metod();
}
что то я совсем запутался
Александр Анисимов
41 уровень
Объясните пожалуйста, что вообще тут происходит
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
21 февраля 2022, 13:39
Интерфейс - это контракт. Когда ты говоришь, что класс реализует интерфейс, ты тем самым утверждаешь что твой класс будет удовлетворять описанию этого интерфейса, то есть иметь реализацию всех его абстрактных методов. Что из себя будет представлять эта реализация - в каждом классе может быть реализовано по-разному, но у объекта этого класса точно можно будет вызвать метод, объявленный в интерфейсе.
В переменную типа интерфейса можно положить любой объект, который реализует этот интерфейс:
List<String> list = new ArrayList<>();
List<String> list = new LinkedList<>();
Интерфейс List содержит объявление методов add(), remove() и других, которые есть у всех списков. Каждый список может добавлять элементы как-то по своему, но каждый может добавлять.
В твоём примере какая-то из реализаций интерфейса придёт в конструктор в качестве параметра.
Если заменить в твоём примере интерфейс Interface на тот же List, то параметром может прийти любая его реализация, например так:
А для выполнения метода metod() вызывается такой метод у этого объекта, который пришёл тебе в качестве параметра, он ведь тоже реализует интерфейс Interface, следовательно он умеет выполнять метод metod().
Таким образом твой класс Class просто выступает в качестве обёртки для объекта типа Interface.
0
Александр Анисимов
22 февраля 2022, 07:44
Спасибо) я понимаю, что в переменную типа Interface можно положить любой объект потомка этого интерфейса. мне не совсем понятна конкретная реализация в задаче.
если конкретнее то вопрос в чем:
1 Мы создаем обертку на интерфейс, но не пишем реализацию, т.е. это по сути такой же интерфейс или абстрактный класс получается? логика такая же как с геттерами и сеттерами? мы закрываем доступ к интерфейсу? но интерфейс ничего не хранит же, это просто шаблон поведения, не реализованная логика.
2 Interface interface = new Class(new Interface); это так должно выглядеть что ли? или new Class в конструктор пойдет?
3 создали экземпляр класса класс в нем поле
interface в котором лежит ссылка на самого себя что ли? вот тут вообще не понимаю
0
Александр Анисимов
22 февраля 2022, 07:53
в общем вопрос что мы создаем, что в этом созданном лежит, и что оно делает?)
0
hidden #598481
22 февраля 2022, 08:55решение
1 Мы создаем обертку на интерфейс, но не пишем реализацию
Ты пишешь обёртку на какую-то из реализаций интерфейса. Какая реализация будет передана в качестве параметра в конструктор, той реализации и будут делегировано выполнение методов этого интерфейса.
Представь, что тебе нужны именованные списки, чтобы у списка можно было всегда спросить getName() и получить название этого списка.
Пусть для простоты это будут списки строк.
Ты пишешь такую обёртку на List
и все методы, связанные со списками, делегируешь обёрнутому в твой класс объекту.
Дальше ты можешь создать таким образом именованный список.В параметрах ты передаёшь не какой-то абстрактный List, а конкретный список, в моём примере это пустой список (новый объект), а может быть и имеющийся созданный ранее список. При этом вся реализация методов списка для этого объекта cars будет взята из класса ArrayList, т.к. именно объект этого списка ты поместил в переменную.
То есть твой класс делегирует реализацию методов обёрнутому в него объекту.
Почитай про декораторы и другие шаблоны проектированияhttps://refactoring.guru/ru/design-patterns/decorator
+4
Александр Анисимов
22 февраля 2022, 10:06
спасибо тебе добрый человек) вреде осознал)
принцип такой как я понимаю, плюс в обертку еще добавляется что то необходимое поверх
принцип такой как я понимаю, плюс в обертку еще добавляется что то необходимое поверх 0
hidden #598481
22 февраля 2022, 10:26
Ага.
Обёртка это типа как чехол на телефон с лазерной указкой.
Звонить и писать будет телефон внутри чехла, а лазером пиу-пиу сам чехол.
+2
Баба-Яга
21 февраля 2022, 13:35
Interface interface - это некий экземпляр класса, реализующего этот интерфейс. Что и есть ответ на все ваши вопросы
+1