На высоком уровне я понимаю, что интерфейс — это способ сказать
Просто сделай это, мне все равно, как
Другими словами, это в основном позволяет вам программировать декларативно, а не императивно. Вы делаете свой код более гибким, когда его части могут указывать другим частям, что делать, а не как это делать.
Я понимаю эту концепцию, когда речь идет о языках высокого уровня, таких как Java.
Однако мне любопытно, как компиляторы работают с интерфейсами. Это может быть больший вопрос, чем я понимаю.
Вот моя теория: она основана на смещении в оперативной памяти.
Например, когда создается объект, который реализует интерфейс ICompare
, который включает метод Compare
, компилятор знает, что этот метод Compare
нужно поместить в 16-байтовое смещение от того места, где этот объект начинается в ОЗУ. Фактически каждый объект, реализующий метод ICompare
, имеет свой метод Compare
в 16-м байте. Таким образом, когда другой код использует этот интерфейс для вызова метода Compare
, система знает, что нужно выполнять инструкции в 16-м байте этого объекта.
Это то, как компилятор обрабатывает интерфейсы (используя стандартное местоположение в каждом объекте) или он использует какую-то таблицу поиска, чтобы узнать, где находится метод Compare
объекта? Или какой-то другой метод совсем?