Что делает Virtual и Override за сценой? - PullRequest
7 голосов
/ 21 августа 2009

Я только что понял, что Virtual и Override используются для (я не могу найти применение так долго). Теперь я использую их в Factory Patterns. Таким образом, мой вопрос заключается в том, что Virtual и Override делают за сценой? Я готов пойти на IL и машинный код.

Ответы [ 3 ]

15 голосов
/ 21 августа 2009

Я не могу дать вам никакого представления о том, как это делается в IL, но основная теория проста.

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

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

Таким образом, вы получаете как наследование методов от родительских классов, так и возможность изменять их определения в дочерних классах.

Для получения дополнительной информации см. Статью Википедии о Таблица виртуальных методов .

4 голосов
/ 21 августа 2009

Если вы заинтересованы в IL, используйте ildasm.exe для просмотра скомпилированной программы (DLL или EXE). Вы увидите, что методы, помеченные вами как «виртуальные», в IL просто помечаются как «виртуальные».

Волшебство происходит во время выполнения. CLR создает «таблицу диспетчеризации методов» (или «таблицу виртуальных методов»), которую он использует для поиска методов вашего класса в памяти. Чтобы разрешить полиморфизм, когда одно и то же имя метода означает разные вещи в зависимости от типа среды выполнения, для виртуальных методов требуется дополнительный поиск. (Можно сказать, что они называются «виртуальными» методами именно потому, что они выбраны «в силу» того, над чем они работают, - но смотрите комментарии @ Павла.) Джо Даффи выразился так:

Виртуальный вызов метода очень как обычный звонок, кроме того, что это должен искать цель вызова в время выполнения, основанное на объекте this.

Это основы. Дон Бокс хорош для чтения, если вы действительно хотите пойти дальше с этим.

4 голосов
/ 21 августа 2009

Вам не нужно вдаваться в IL - virtual и override охватывают хорошо известную концепцию ориентации объекта, известную как полиморфизм . Фактически, когда осуществляется доступ к полиморфному методу или свойству, какой метод / свойство на самом деле применяется, определяется только во время выполнения. Под капотом, в основном, правильный метод (в случае свойства это также и метод) определяется путем доступа к таблице виртуальных методов - таблице поиска для поиска правильного метода, основанной на тип времени выполнения.

...