Пытаюсь осмыслить код этой задачи, а именно то, как интерфейс может быть параметром? Может кто-то объяснить на пальцах и ещё на нескольких примерах?
class Manager implements Boss {
public void use(Person person) {
person.startToWork();
}
нашел определение в интернете:
(Person person) - это на самом деле один из самых распространенных и полезных способов использования интерфейса. Интерфейс определяет контракт, и ваш код может работать с любым классом, который реализует интерфейс, без необходимости знать конкретный класс - это может даже работать с классами, которые еще не существовали, когда код был написан.
не могу понять его механику, как это определение работает с методом person.startToWork()?
Vadimayer
40 уровень
Пытаюсь осмыслить этот код
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Edil Kalmamatov
30 августа 2021, 00:25
Это значит, что метод принимает в качестве параметра любой объект, который поддерживает интерфейс Person:
class ... implements Person{}
учитывая, что экземпляр интерфейса и абстрактного класса создать нельзя, в метод use(Person person) могут передаваться только полноценные классы. А у таких классов, должен существовать реализованный метод startToWork().
+1
Павел Безумный учёный Expert
30 августа 2021, 00:21
Интерфейс гарантирует, что на объекте можно вызвать определённые методы.
Рассмотрим следующий пример:
Класс A реализует интерфейс MyInterface, и это означает, что методы method1() и method2() обязательно должны быть реализованы в классе A. Помимо этих методов класс может содержать также и другую «начинку» – поля, методы, внутренние классы и пр., но для интерфейса MyInterface важно лишь то, чтобы были реализованы именно его методы (можно сказать, что это его «зона ответственности»). +1
Павел Безумный учёный Expert
30 августа 2021, 00:21
Благодаря этому можно утверждать, что на созданном объекте типа A всегда гарантированно можно вызвать методы method1() и method2() без ошибок компиляции. Ссылку же на сам объект можно хранить не только в переменной типа A, но и в переменной типа реализуемого интерфейса, т. е. MyInterface. Разница в том, что по ссылке типа A на объекте могут быть вызваны все три метода method1(), method2() и method3(), тогда как по ссылке типа MyInterface на тот же объект доступны только первые два метода (см. строки 38-44).
Метод process() принимает аргумент типа MyInterface. Это означает, что в метод может быть передан любой объект, но при соблюдении единственного обязательного условия: класс передаваемого объекта должен реализовать интерфейс MyInterface. Если это условие выполняется, ссылка на передаваемый в метод объект сохраняется в переменной obj (подобно тому, как ссылка на объект a может быть сохранена в переменную myInterface, см. строки 35-36). После этого в теле метода process() на объекте obj могут достоверно вызываться методы method1() и method2(). Однако метод method3() по ссылке obj не может быть вызван, поскольку эта часть функционала объекта a «скрыта»; «видны» только методы интерфейса MyInterface.
+1
Павел Безумный учёный Expert
30 августа 2021, 00:22
Если попытаться передать в метод process() объект b, получим ошибку компиляции. Класс B не реализует интерфейс MyInterface и неизвестно, что «внутри» у этого объекта. Нет никаких гарантий, что на объекте b можно будет вызвать методы method1() и method2(), необходимые для работы метода process(). Поэтому компилятор не «позволит» передать в метод process() объект типа B.
+1
darklight1985
29 августа 2021, 19:05
Добрый вечер. Если вспомнить, то в Java все является объектом (кроме примитивных типов). Значит и объекты интерфейса тоже есть и их можно тоже передавать как параметры. Вопрос зачем? На эту тему много материалов но реализацию можно будет понять позже только на практике.Знаю точно используется в коллекциях, но подробно пока не разбирал. А пока это просто абстрактный пример показывающий как правильно можно реализовывать интерфейсы и наследование. Важно запомнить прием, который позже где-то понадобится применить.
0