Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / академ вопрос по интерфейсам / 17 сообщений из 17, страница 1 из 1
22.04.2015, 10:21
    #38942218
Алексей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
всем добрый день

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

Заранее спасибо.
...
Рейтинг: 0 / 0
22.04.2015, 10:27
    #38942228
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
...
Рейтинг: 0 / 0
22.04.2015, 10:33
    #38942238
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
Что-то я не понял. Cast как работает в .Net?
...
Рейтинг: 0 / 0
22.04.2015, 11:00
    #38942264
Алексей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
Алексей К,

К сожалению нет.
...
Рейтинг: 0 / 0
22.04.2015, 11:00
    #38942265
Алексей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
skyANA,

не понял вопроса.
...
Рейтинг: 0 / 0
22.04.2015, 11:27
    #38942303
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
Алексей,
интерфейс по существу абстрактный класс, вот и исходите из этого понимания при приведении типов, можете открыть код декомпилятором и посмотреть как реализован этот фокус.
...
Рейтинг: 0 / 0
22.04.2015, 11:52
    #38942342
Алексей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
Посмотрел
Получаю на ((I_Shared)shrd).SetInt();
две инструкции
IL_000a: castclass ConsoleApplication1.I_Shared
IL_000f: callvirt instance void ConsoleApplication1.I_Shared::SetInt()

Я не могу понять как вызывается именно интерфейс I_Shared? В таблице интерфейсов нужный ищется по идентификатору?
...
Рейтинг: 0 / 0
22.04.2015, 12:04
    #38942359
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
АлексейПосмотрел
Получаю на ((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
...
Рейтинг: 0 / 0
22.04.2015, 12:15
    #38942381
Алексей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
Antonariy,

А при создании переменной интерфейсного типа она получает такой же порядковый номер?
...
Рейтинг: 0 / 0
22.04.2015, 12:17
    #38942388
Алексей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
Antonariy,

Спасибо за статью.
...
Рейтинг: 0 / 0
22.04.2015, 12:17
    #38942389
Алексей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
Antonariy,

Спасибо за статью.
...
Рейтинг: 0 / 0
22.04.2015, 12:28
    #38942407
Алексей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
Прочитал вот эту статью
https://msdn.microsoft.com/en-us/magazine/cc163791.aspx
Из этого возник вопрос как определяется нужный интерфейс, когда происходит приведение экземпляра к интерфейсу. Ведь интерфейсов класс может реализовать несколько.


Что то заклинило меня на этом вопросе
...
Рейтинг: 0 / 0
22.04.2015, 13:12
    #38942477
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
АлексейAntonariy,

А при создании переменной интерфейсного типаЭта фраза является бессмыслицей. Можно объявить переменную интерфейсного типа, но создается всегда экземпляр класса.

Методы объекта записываются в табличку в памяти. Табличка начинается с собственных методов класса, потом унаследованных (а может наоборот, vb6 наследовать не умеет, проверить не могу, копать теорию лень), потом интерфейсных.

Переменная классового типа указывает на начало таблицы методов объекта, интерфейсная - на то место, с которого начинаются методы интерфейса:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Dim v1 As Class1
    Dim v2 As IClass1
    Set v1 = New Class1
    Set v2 = v1
    Debug.Print ObjPtr(v1)
    Debug.Print ObjPtr(v2)

 111484728 
 111484788 

Алексейтакой же порядковый номерСтрого говоря, это тоже бессмыслица, поскольку номер виртуальный. Порядковый номер получается из смещения указателя на метод относительно начала. Каждый указатель занимает 4 байта в x86 и 8 в x64. В этом примере начало интерфейса убежало аж на 60 байт из-за интерфейсов IUnknown и IDispatch: 7 методов * 8 байт + 4 заголовок = 60, а класс собственных методов не имеет. Так что первый метод интерфейса будет восьмым в VTable. Если это COM, как там в .net-объектах память устроена, я не в курсе.
...
Рейтинг: 0 / 0
22.04.2015, 13:15
    #38942488
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
Antonariy Табличка начинается с собственных методов класса, потом унаследованных (а может наоборот, vb6 наследовать не умеет, проверить не могу, копать теорию лень), потом интерфейсных.Наврал, таблица начинается с IUnknown, потом IDispatch, потом все остальное в том порядке, в котором было задекларировано в исходниках.
...
Рейтинг: 0 / 0
22.04.2015, 13:21
    #38942500
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
И в самом конце - методы класса.
...
Рейтинг: 0 / 0
22.04.2015, 13:37
    #38942516
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
АлексейПрочитал вот эту статью
https://msdn.microsoft.com/en-us/magazine/cc163791.aspx
Из этого возник вопрос как определяется нужный интерфейс, когда происходит приведение экземпляра к интерфейсу. Это происходит на этапе компиляции. По принципу, изложенному выше, компилятор определяет размер смещения в памяти относительно начала объекта, по которому залегает указатель на метод, и запендюривает получившееся количество байт в какой-нибудь mov или call или я х.з. что в этом вашем ассемблере.
...
Рейтинг: 0 / 0
22.04.2015, 13:47
    #38942534
Алексей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
академ вопрос по интерфейсам
Antonariy,

Спасибо за развернутый ответ
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / академ вопрос по интерфейсам / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]