powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / академ вопрос по интерфейсам
17 сообщений из 17, страница 1 из 1
академ вопрос по интерфейсам
    #38942218
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем добрый день

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

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

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

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

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

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

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

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


Что то заклинило меня на этом вопросе
...
Рейтинг: 0 / 0
академ вопрос по интерфейсам
    #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
академ вопрос по интерфейсам
    #38942488
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy Табличка начинается с собственных методов класса, потом унаследованных (а может наоборот, vb6 наследовать не умеет, проверить не могу, копать теорию лень), потом интерфейсных.Наврал, таблица начинается с IUnknown, потом IDispatch, потом все остальное в том порядке, в котором было задекларировано в исходниках.
...
Рейтинг: 0 / 0
академ вопрос по интерфейсам
    #38942500
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И в самом конце - методы класса.
...
Рейтинг: 0 / 0
академ вопрос по интерфейсам
    #38942516
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейПрочитал вот эту статью
https://msdn.microsoft.com/en-us/magazine/cc163791.aspx
Из этого возник вопрос как определяется нужный интерфейс, когда происходит приведение экземпляра к интерфейсу. Это происходит на этапе компиляции. По принципу, изложенному выше, компилятор определяет размер смещения в памяти относительно начала объекта, по которому залегает указатель на метод, и запендюривает получившееся количество байт в какой-нибудь mov или call или я х.з. что в этом вашем ассемблере.
...
Рейтинг: 0 / 0
академ вопрос по интерфейсам
    #38942534
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

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


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