Как интерфейсы представлены на более низком уровне / уровне сборки? - PullRequest
1 голос
/ 07 февраля 2020

Я понимаю, что объекты - это просто порции данных, где первая переменная-член начинается в том же месте, что и объект. Например, объект, указатель которого указывает на местоположение 0x0100, также будет иметь первую переменную-член, расположенную в 0x0100.

Но как работают интерфейсы на языке типа Java, которые не имеют реализации, работают? Это чисто абстрактные типы.

Как процессор или компилятор узнают, что интерпретировать объект A как интерфейс X или объект B как интерфейс X и Y в зависимости от контекста? Это сделано на уровне компилятора, которое не имеет отношения к интерпретациям более низкого уровня?

1 Ответ

2 голосов
/ 07 февраля 2020

Вы должны понимать, что в таких языках, как Java & C#, первый член экземпляра является указателем на общий объект класса; этот объект участвует в идентификации фактического класса, который был создан, в проверке приведений, в определении переопределений для вызова вызовов виртуальных методов и в определении реализации, используемой для вызовов метода интерфейса.

Но как работают интерфейсы на языке, подобном Java, которые не имеют реализации? Это чисто абстрактные типы.

Конечно, сами интерфейсы являются «абстрактными», но методы интерфейса всегда вызываются на экземплярах конкретных классов (которые реализуют интерфейсы), так что тут-то и возникает реализация.

Язык обрабатывает интерфейсы, аналогичные классам (как абстрактным, так и конкретным), присваивая их методы индексам и используя эти индексы методов при поиске (в объекте общего класса экземпляра), чтобы найти фактическую реализацию для invoke.

Таким образом, ключ заключается в том, что методам интерфейса задаются позиции в массиве ссылок на методы внутри общего объекта класса каждого экземпляра типа (который реализует интерфейс), так что каждый класс может иметь разные реализация метода интерфейса.

...