.NET, как реализованы интерфейсы через статические методы?
От:
Аноним
Дата:
23.06.14 10:54
Оценка:
Мне понятно, как работает таблица виртуальных функций, и как вызывается виртуальный метод потомка через указатель на базовый класс.
Но не понятно, как в .NET работают интерфейсы. Можно вызвать метод класса через указатель на интерфейс, и этот метод может быть совсем не виртуальным.
Как это устроено внутри?
Re: .NET, как реализованы интерфейсы через статические методы?
Здравствуйте, Аноним, Вы писали:
А>Мне понятно, как работает таблица виртуальных функций, и как вызывается виртуальный метод потомка через указатель на базовый класс. А>Но не понятно, как в .NET работают интерфейсы. Можно вызвать метод класса через указатель на интерфейс, и этот метод может быть совсем не виртуальным. А>Как это устроено внутри?
Хранится interface map, фактически аналог vtbl под каждый реализуемый интерфейс. Соответственно вызовы через ссылку на интерфейс компилируется в обращение к конкретному map.
Re[2]: .NET, как реализованы интерфейсы через статические методы?
От:
Аноним
Дата:
23.06.14 11:43
Оценка:
Спасибо, понятно, логично.
Re: .NET, как реализованы интерфейсы через статические методы?
Здравствуйте, Аноним, Вы писали:
А>Как это устроено внутри?
Как я понимаю, речь шла не о статических, а о non-virtual методах.
Компилятор или объявляет их виртуальными (если базовый класс и класс, реализующий интерфейс, находятся в одной сборке), или генерит explicit interface implementation. Чуть более подробно тут.
Если интересуют совсем низкоуровневые подробности определения нужного метода в рантайме — см раздел Dispatching Static and Interface Methods в Pro .NET Performance от Sasha Goldshtein (очень рекомендую всю книгу целиком).
Re[2]: .NET, как реализованы интерфейсы через статические методы?
От:
Аноним
Дата:
23.06.14 12:30
Оценка:
Да, все правильно, о "не виртуальных методах", а не статических, конечно. Спасибо.
Re: .NET, как реализованы интерфейсы через статические методы?
Здравствуйте, Аноним, Вы писали:
А>Но не понятно, как в .NET работают интерфейсы. Можно вызвать метод класса через указатель на интерфейс, и этот метод может быть совсем не виртуальным.
Компилятор превратит метод sealed virtual, или (если это невозможно) создаст дополнительный sealed virtual proxy-метод.