Что такое "Интерфейс"?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Что такое "Интерфейс"?

Сообщение A.A.Z. » 14.06.2004 (Пн) 15:04

Тут недавно затрагивалась эта тема, интересно стало... Что такое "интерфейс"? В смысле, не интерфейс программы, а интерфейс типа "IUnknown"? Что это, зачем оно, можно ли его использовать с пользой, если да, то как? :roll:
Нет меня больше

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 14.06.2004 (Пн) 16:16

Как я понимаю, интерфейс объекта - подразумеватся способ взамиодействия с объектом. Т.е. тот метод которым ты заставляяешь объект выполнить нужную тебе операцию :roll:
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 14.06.2004 (Пн) 19:38

Например? :?: :roll:
Нет меня больше

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.06.2004 (Пн) 19:50

На самом деле происходит примерно так:
Ваша программа создает экземпляр какого-то объекта, к примеру Word.Document, и получает ссылку на стандартный интерфейс IUnknown. Здесь одна особенность: как не странно не у одного объекта в COM нет открытых свойств(в понимании программиста C). Далее Ваша программа вызывает функцию QueryInterface, передает ей CLSID интерфейса, и получает ссылку на интерфейс объекта. Интерфейс имеет ряд открытых свойств и методов. Вы эти свойства вызываете, и тем самым выполняете какие-то операции.
Тема бесконечная. Есть еще такая штука, как AddRef и Release, фабрика классов(Class Factory) и прочее.
Важно понять следуещее: когда Вы создаете класс(к примеру Cls1) VisualBasic автоматически создает к нему дефолтовый интерфейс ICls1. Этот класс также поддерживает "базовый" интерфейс IUnknown. Если хочешь добавить еще интерфейсы исполдьзую оператор Implements <имя_интерфейса>.

Простой пример для понимания: создай класс Cls1. Далее в коде формы пиши:

public sub Sub1()
dim A as ICls1
set A=new Cls1
'ошибок нет
end Sub

public sub Sub2()
dim A as IUnknown
set A=new Cls1
'ошибок нет
end Sub

public sub Sub3()
dim A as IPictureDisp
set A=new Cls1
'обрати внимание, что ошибка появилась в период Run-time, а не при компиляции
end Sub

public sub Sub4()
dim A as ICls1
set A=new ICls1
'ошибка! ICls1 это интерфейс, а не класс
end Sub


Ну вроде объяснил, как мог. Будут вопросы - пиши :!:

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 14.06.2004 (Пн) 20:17

Пасиба! :D Что-то понял! :)
Нет меня больше

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.06.2004 (Вт) 10:31

Углубим чуток (отметив правильность уже сказанного) :)

Интерфейс - это число :) Размером ровно 4 байта. Указатель это. Самый обыкновенный.
Указывает он на одномерный массивчик. Каждый элемент массивчика - это тоже указатель! :) Но уже на конкретный метод интефейса.
Когда мы осуществляем "вызов метода интерфейса", на деле происходит следующее. Комп дереференсит интерфейс, прибавляя при этом к нему ((номер вызываемого метода - 1)*4). Туда управление и передаётся. Как комп узнаёт, какой номер у вызываемого метода? Из описания, в type library, к примеру. Всё это называется ранним связыванием.
При позднем связывании всё несколько интереснее. Сначала происходит обращение к IUnknown объекта (IUnknown всегда идёт первым, так что QueryInterface всегда имеет нулевой оффсет в табличке, и комп знает это). Через QueryInterface делается запрос на интерфейс IDispatch. Через IDispatch (который тоже стандартен, и потому VB с ним тоже умеет работать) происходит вызов метода Invoke. CallByName - как раз обёртка для этого процесса :)
Если интерфейс разрешает как раннее, так и позднее связывание, он имеет статус dual.
На всём этом зиждется технология COM.

Использовать это можно и нужно. Но напрямую из VB нельзя юзать интерфейсы, не поддерживающие IDispatch (хотя при наличии tlb, по идее, можно). Не напрямую - можно :) Относительно корявый метод я описал в маленькой статейке :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 15.06.2004 (Вт) 18:03

Надо будет сохранить эту страничку, через месяцок-другой точно дойдёт :) Как было с ByVal и ByRef :)
Нет меня больше

Sanya Z
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 18.08.2003 (Пн) 3:15
Откуда: Москва

Сообщение Sanya Z » 17.06.2004 (Чт) 8:00

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

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.06.2004 (Чт) 8:52

А также визуальное представление программы.

Но речь таки идет об интерфейсе в понятии COM.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 17.06.2004 (Чт) 10:00

Ой, грузите вы человека по полной программе...
Начинать-то надо вообще с понятия "интерфейс", а потом уж и IUnknown, и IDispatch дойдет

MSDN есть? По ключевому слову "Implements statement" найдешь кучку полезных статей, где на примерах все рассказывают.

Вообще, интерфейс - это набор свойств и методов. Это заданная модель поведения объектов. Интерфейс не предусматривает реализации этих методов. Нельзя создать (new) объект такого класса. Его можно только запросить (QueryInterface). Например, интерфейс "машина" может иметь свойство "количество колес", "количество дверей", методы "завестись", "поехать прямо", "повернуть".

Далее уже конкретные классы реализуют (имплементируют) интерфейс - предоставляют конкретную реализацию для методов.
Например, класс "запорожец" имеет 4 колеса, 2 двери. В коде метода "завестись" он сначала вызовет локальный методы "запустить двигатель, заглохнуть, снова запустить двигатель". А класс "камаз" имеет 2 двери, 6 колес и заводиться будет с жутким шумом и выхлопами...

Там, где в программе тебе не важно, с каким именно классом ты работаешь, но важно чтобы это была машина - ты будешь работать с интерфейсом. Это я пытаюсь объяснить про QueryInterface. Просто в VB он неявный.

Dim pCar as ICar
Dim pKamaz as New CKamaz
Set pCar = pKamaz

Вот последняя строчка как раз и была тем самым QueryInterface. Мы запросили у камаза интерфейс машины. И дальше будем работать с камазом как с просто машиной. Методы, естественно, камазные вызываться будут.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 17.06.2004 (Чт) 16:33

Спасибо всем!
Нет меня больше


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 1

    TopList