Задать вопрос
@nevro
не пойми кто

Приведение к типу интерфейса: какой смысл?

Если у метода есть входной параметр тип интерфейса, например, ISome, то мы можем передать в него объект любого типа, главное, чтобы объект реализовывал этот интерфейс.
void method(ISome obj){.....}
Удобно - единообразная работа с объектами любых типов. Но не пойму механику: у нас после приведения в obj теперь ссылка на блок методов (точнее сигнатур) ISome, а это только сигнатуры без реализации, и кроме того нет доступа к полям объекта obj! Но получается, я не прав. Объясните правильную механику.
  • Вопрос задан
  • 2367 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
alexclear
@alexclear
A cat
> Но не пойму механику: у нас после приведения в obj теперь ссылка на блок методов (точнее сигнатур) ISome, а это только сигнатуры без реализации

А куда делась реализация? Исходно она была.
Приведение типов не меняет внутреннюю структуру объекта, как и метаинформацию о нем.
Какого типа он был исходно - такого и остался. Вы можете рефлекшном проверить.

> и кроме того нет доступа к полям объекта obj!

Нет доступа откуда именно?

> Но получается, я не прав.

Я не до конца понимаю, что именно Вы себе представили не так, но Вы, видимо, представили что-то неправильное. Объект после приведения типа остается все тем же.
Ответ написан
Вы не понимаете механику полиморфизма и виртуальных вызовов.

Интерфейс - это окно, через которое вы смотрите на реальный объект. Механизм позднего связывания, а именно - виртуальных функций - позволяет вам иметь ссылку типа ISome, которая, тем не менее, ссылается на РЕАЛЬНЫЙ объект с РЕАЛИЗАЦИЯМИ методов интфейса ISome, и вызывать эти методы через интерфейс.

Обратите внимание - компилятор не позволит вам написать new ISome; (можете попробовать), т.к. невозможно инстанциировать интерфейс. Это всего лишь договор о взаимодействии, и для того, чтобы взаимодействие произошло, нужно чтобы этому договору подчинялись какие-либо реальные объекты.

Когда вы приводите тип ссылки от SomeObject к ISome, сама ссылка НЕ МЕНЯЕТСЯ (по кр. мере вы этого не увидите), переменная нового типа ссылается на ТОТ ЖЕ САМЫЙ объект, а не на "блок методов". Ссылки всегда указывают на конкретные объекты, невозможно сослаться на "блок методов", не имеющий реализации, язык так не работает. Суть интерфейсов в том, что они соединяют в себе идею позднего связывания и строгую типизацию одновременно. Используя ссылку типа ISome вместо SomeObject, вы как бы смотрите на тот же объект через другое "окно", и видите у него другой набор методов. Это важнейший этап в процедуре абстрагирования - найти у объектов похожие черты, и реализовать ряд алгоритмов на этой основе. Как вы и сами уже заметили - единообразно работать с объектами разных типов.
Ответ написан
@IceJOKER
Web/Android developer
Один из первых моих вопросов на Тостере - ООП — Как понимать Интерфейсы в java?
Ответ написан
LeEnot
@LeEnot
Енот-андроид
Гуглите "динамический полиморфизм".
Вкратце: при вызове метода интерфейса, java-машина проверяет тип реально использующегося объекта и вызывает его метод.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы