Интерфейс Раннее / Позднее связывание в .Net - PullRequest
3 голосов
/ 18 ноября 2010

В пункте 23 Вагнера " Effective C # " он объясняет, что

методы интерфейса не виртуальные ... они являются декларацией конкретная реализация.

Я считаю, что это загадка, потому что это означает, что методы интерфейса представляют раннее связывание, и тем не менее они ведут себя как позднее связывание. Это вызывает любопытство о том, как они работают под одеялом. В C ++ это превратилось бы в обсуждение vtables. В C # я не знаю, во что это превращается. Может кто-нибудь разобрать это?

p.s. В этом вопросе двоюродный брат , но этот вопрос касается интерфейсов.
p.p.s. Пожалуйста, не беспокойтесь о «вам не нужно знать, как это работает». Опять же, это из любопытства.

1 Ответ

6 голосов
/ 18 ноября 2010

Да, они не являются виртуальными с языковой точки зрения. Но они на самом деле, насколько CLR обеспокоен. Этот пример кода:

class Example : IDisposable {
    public void Dispose() {}
}

Создает этот IL для метода Dispose ():

.method public hidebysig newslot virtual final    // <=== here
        instance void  Dispose() cil managed
{
  // Unimportant
} // end of method Example::Dispose

Обратите внимание на атрибуты метода: virtual и final . Последнее гарантирует, что вы не сможете переопределить метод в производном классе. Заставить реализацию метода интерфейса вести себя как не виртуальный метод в языке, а виртуальный во время выполнения.

Это также отвечает на ваш вопрос о раннем / позднем связывании. Это рано, слот v-таблицы заполняется, когда класс загружается.

...