|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
всем добрый день Подскажите пожалуйста кто знает, как осуществляется диспетчеризация интерфейсных вызовов. Конкретнее, хотелось бы понять как экземпляр объектов приводится к интерфейсу, как в IVMap определяется нужный интерфейс, когда я привожу экземпляр объекта к переменной типа интерфейс. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 10:21 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
Что-то я не понял. Cast как работает в .Net? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 10:33 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
Алексей К, К сожалению нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 11:00 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
skyANA, не понял вопроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 11:00 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
Алексей, интерфейс по существу абстрактный класс, вот и исходите из этого понимания при приведении типов, можете открыть код декомпилятором и посмотреть как реализован этот фокус. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 11:27 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
Посмотрел Получаю на ((I_Shared)shrd).SetInt(); две инструкции IL_000a: castclass ConsoleApplication1.I_Shared IL_000f: callvirt instance void ConsoleApplication1.I_Shared::SetInt() Я не могу понять как вызывается именно интерфейс I_Shared? В таблице интерфейсов нужный ищется по идентификатору? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 11:52 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
АлексейПосмотрел Получаю на ((I_Shared)shrd).SetInt(); две инструкции IL_000a: castclass ConsoleApplication1.I_Shared IL_000f: callvirt instance void ConsoleApplication1.I_Shared::SetInt() Я не могу понять как вызывается именно интерфейс I_Shared? В таблице интерфейсов нужный ищется по идентификатору?по порядковому номеру. здесь читай: http://devdoc.web-ide.ru/index.php/content/view/virtual_base.htm ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 12:04 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
Antonariy, А при создании переменной интерфейсного типа она получает такой же порядковый номер? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 12:15 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
Antonariy, Спасибо за статью. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 12:17 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
Antonariy, Спасибо за статью. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 12:17 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
Прочитал вот эту статью https://msdn.microsoft.com/en-us/magazine/cc163791.aspx Из этого возник вопрос как определяется нужный интерфейс, когда происходит приведение экземпляра к интерфейсу. Ведь интерфейсов класс может реализовать несколько. Что то заклинило меня на этом вопросе ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 12:28 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
АлексейAntonariy, А при создании переменной интерфейсного типаЭта фраза является бессмыслицей. Можно объявить переменную интерфейсного типа, но создается всегда экземпляр класса. Методы объекта записываются в табличку в памяти. Табличка начинается с собственных методов класса, потом унаследованных (а может наоборот, vb6 наследовать не умеет, проверить не могу, копать теорию лень), потом интерфейсных. Переменная классового типа указывает на начало таблицы методов объекта, интерфейсная - на то место, с которого начинаются методы интерфейса: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Алексейтакой же порядковый номерСтрого говоря, это тоже бессмыслица, поскольку номер виртуальный. Порядковый номер получается из смещения указателя на метод относительно начала. Каждый указатель занимает 4 байта в x86 и 8 в x64. В этом примере начало интерфейса убежало аж на 60 байт из-за интерфейсов IUnknown и IDispatch: 7 методов * 8 байт + 4 заголовок = 60, а класс собственных методов не имеет. Так что первый метод интерфейса будет восьмым в VTable. Если это COM, как там в .net-объектах память устроена, я не в курсе. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 13:12 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
Antonariy Табличка начинается с собственных методов класса, потом унаследованных (а может наоборот, vb6 наследовать не умеет, проверить не могу, копать теорию лень), потом интерфейсных.Наврал, таблица начинается с IUnknown, потом IDispatch, потом все остальное в том порядке, в котором было задекларировано в исходниках. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 13:15 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
И в самом конце - методы класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 13:21 |
|
академ вопрос по интерфейсам
|
|||
---|---|---|---|
#18+
АлексейПрочитал вот эту статью https://msdn.microsoft.com/en-us/magazine/cc163791.aspx Из этого возник вопрос как определяется нужный интерфейс, когда происходит приведение экземпляра к интерфейсу. Это происходит на этапе компиляции. По принципу, изложенному выше, компилятор определяет размер смещения в памяти относительно начала объекта, по которому залегает указатель на метод, и запендюривает получившееся количество байт в какой-нибудь mov или call или я х.з. что в этом вашем ассемблере. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 13:37 |
|
|
start [/forum/topic.php?fid=20&msg=38942265&tid=1401630]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
35ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 359ms |
total: | 471ms |
0 / 0 |