Вы должны понимать, что в таких языках, как Java & C#, первый член экземпляра является указателем на общий объект класса; этот объект участвует в идентификации фактического класса, который был создан, в проверке приведений, в определении переопределений для вызова вызовов виртуальных методов и в определении реализации, используемой для вызовов метода интерфейса.
Но как работают интерфейсы на языке, подобном Java, которые не имеют реализации? Это чисто абстрактные типы.
Конечно, сами интерфейсы являются «абстрактными», но методы интерфейса всегда вызываются на экземплярах конкретных классов (которые реализуют интерфейсы), так что тут-то и возникает реализация.
Язык обрабатывает интерфейсы, аналогичные классам (как абстрактным, так и конкретным), присваивая их методы индексам и используя эти индексы методов при поиске (в объекте общего класса экземпляра), чтобы найти фактическую реализацию для invoke.
Таким образом, ключ заключается в том, что методам интерфейса задаются позиции в массиве ссылок на методы внутри общего объекта класса каждого экземпляра типа (который реализует интерфейс), так что каждый класс может иметь разные реализация метода интерфейса.