Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2009, 09:37   #21
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А это не от языка зависит.
Допустим есть некая функция, которая возвращает указатель.
Вопрос - указатель на что она вернет? Ответ - в зависимости от параметра:
Код:
 Interfase:=func(Get_me_print);
 Interfase:=func(Get_me_Doc);

 Print:=IPrint(Interfase);
 Doc:=IDoc(Interfase)
Где Get_me_print=1, а Get_me_Doc=2, interfase:IDispatch
А print и Doc соответственно интерфейсы
Но предположим функция в связи с ошибкой вернет неверный указатель, как проверить на какой интерфейс он указывает?
1. Не надо писать функции, которые возвращают неправильные указатели
2. Существуют механизмы по приведению к соответствующему типу. Если не удалось привести интерфейс к нужному, значит не то у нас из функции вернулось
Цитата:
Сообщение от Stilet Посмотреть сообщение
Даже если указатель который вернулся неверный этот код выполнится верно без ошибки, но ведь результат то будет неверен.
Это косяк архитектуры данного приложения, а не интерфейсов. В GDI дескрипторы кистей, перьев и остальных объектов имеют один тип, т.е. проблема та же, что и здесь, а интерфейсами и не пахнет.
Цитата:
Сообщение от Stilet Посмотреть сообщение
К тому же интерфейсы любят привязываться к GUID, и прописываться в реестре - а это потенциальный мусор.
Это только если вы COM интерфейсы используете. В C# и Java интерфейсы не привязываются к GUID'ам и в реестр не пишутся, в С++ интерфейсы не поддерживаются вообще на уровне языка. В делфях интерфейсы только COM кажется, но могу ошибаться.

Множественное наследование трудно реализовывать и оно приводит к некоторым проблемам впоследствии. Поэтому во многих языках отказываются от него и вводят понятие интерфейса. Интерфейс не есть тип, т.е. с абстрактным классом у них ничего общего. Это просто описание методов (аттрибуты никакие в интерфейсах описываться не могут).
Нужны интерфейсы для лучшей переносимости кода и снижению взаимозависимостей отдельных компонент посредством абстрагирования. Если я получаю интерфейс IStream, то мне важно, что это поток и он умеет то и это, а какая у него реализация и что он из себя представляет - не важно. Хоть это файловый поток, хоть по ftp там данные гоняются или еще как.
Допустим, есть у нас сущности: дом, автомобиль, дом на колёсах
вводим интерфейсы: IПомещение, IТранспорт
Соответственно дом реализует интерфейс IПомещение, автомобиль - IТранспорт, а дом на колёсах - оба этих интерфейса.
Гаишники у нас следят за поведением IТранспорт'а на дорогах, а что это за транспорт - их не волнует. Если вдруг решили добавить мотоцикл, то работу гаишников менять не надо (не надо только сейчас вдаваться в глубь ПДД ), ведь мотоцикл тоже реализует IТранспорт. А служанку наймём для уборки IПомещения, а там хоть гараж это, хоть заводское помещение, хоть дом на колёсах. Гаишники всю нужную информацию получат через интерфейс ITранспорт, а служанка - через IПомещение.
В общем случае приводить объект одного интерфейса к другому не требуется и такая необходимость говорит скорее о корявом проектировании.
pu4koff вне форума Ответить с цитированием
Старый 12.08.2009, 09:59   #22
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
значит не то у нас из функции вернулось
Вот вот. Но не всегда разработчики уделяют внимание предоставлению программистам возможности проверить что же вернулось.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.08.2009, 10:13   #23
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

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

Цитата:
предположим функция в связи с ошибкой вернет неверный указатель, как проверить на какой интерфейс он указывает?
Разименовать указатель и проверить что за зверь.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 12.08.2009, 10:27   #24
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Классный пример.
С этого дня pu4koff мой духовный сенсэй, но как говорил Козьма Прутков - дураком я был, дураком и останусь .

И так некая фирма (ну выберем совершенно случайно - Микрософт) решился заюзать интерфейс и создает нам космический челнок (между прочим на дворе 21 век) с интерфейсом IТранспорт. Все восхищены простотой и элегантностью решения. Все, кроме гаишников - IТранспорт? А почему на красный передвигается? Так, космонавты еще и взяток не дают...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 12.08.2009 в 10:33. Причина: Исправил опечатку
Utkin вне форума Ответить с цитированием
Старый 12.08.2009, 10:41   #25
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Разименовать указатель и проверить что за зверь.
Вот чаще всего я встречался с проблемо во что разименовывать (это при отсутствии будь якого описания производителя)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.08.2009, 11:07   #26
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

to Utkin, ну значит наследуем от IТранспорт (интерфейсы тоже прекрасно наследуются) IНаземныйТранспорт, IВодныйТранспорт, IКосмическийТранспорт и т.д. Гаишникам отдаём IНаземныйТранспорт, морской милиции IВодныйТранспорт, а космическим пиратам IКосмическийТранспорт. Только не надо изобретать космический корабль с возможностью езды по земле и посадки на воду, а то опять гаишники обижаться на космонавтов будут

Ну если откинуть COM, то, при наличии множественного наследования, подход с использованием интерфейсов мало нужен, ибо размывается разница между абстрактным классом и интерфейсом. Ну а в C# и Java без интерфейсов никуда. В делфях почему-то и без множественного наследования и интерфейсов я обходился и потому не знаю как там с ними дела обстоят.
pu4koff вне форума Ответить с цитированием
Старый 13.08.2009, 12:18   #27
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А это не от языка зависит.
Допустим есть некая функция, которая возвращает указатель.
Вопрос - указатель на что она вернет? Ответ - в зависимости от параметра:
Код:
 Interfase:=func(Get_me_print);
 Interfase:=func(Get_me_Doc);

 Print:=IPrint(Interfase);
 Doc:=IDoc(Interfase)
Где Get_me_print=1, а Get_me_Doc=2, interfase:IDispatch
Так мы про интерфейсы говорим или про IDispatch, который в принципе нетипизирован?

С тем же успехом можно на Питон жаловаться, особенно, когда обильно применяется утиная типизация.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Но предположим функция в связи с ошибкой вернет неверный указатель, как проверить на какой интерфейс он указывает?
Как правило, интерфейсы дуальные. Не вижу смысла делать чистые диспинтерфейсы. Ну а раз так, можно воспользоваться оператором "is".

Цитата:
Сообщение от Stilet Посмотреть сообщение
К тому же интерфейсы любят привязываться к GUID, и прописываться в реестре - а это потенциальный мусор.
GUID — это хорошо. А реестр использовать необязательно. Если все возможности COM не использовать, то можно внутри процесса гонять свои объекты, никак их не регистрируя.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 13.08.2009, 12:31   #28
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
который в принципе нетипизирован?
Вот в том то и штука что func(Get_me_print) вернет "указатель"

Вот например система Компас. Там хоть и есть описание (скудное) но все равно:
Функа GetParamStruct возвращает указатель на интерфейс указанного типа. Тип указывается в параметрах, но черт его знает что она вернет если будет ошибка...
Я то могу привести типы:
Код:
 DocumentParam:=ksDocumentParam(KompasObjectA.GetParamStruct(ko_DocumentParam));
 KompasActiveDocument.ksGetObjParam(KompasActiveDocument.reference,DocumentParam,ALLPARAM);
   result:=DocumentParam.fileName;
 DocumentParam:=nil;
И уже привиденным к нужному интерфейсу воспользоваться его методами, но а если не то вернется?
Цитата:
Ну а раз так, можно воспользоваться оператором "is"
Ну разве что.
Цитата:
Если все возможности COM не использовать
Не получается. Нужно взаимодействовать с другой программой.

P.S. Я не убеждаю отказываться кого-то от интерфейсов. Я всего лишь говорю что они крайне неудобны мне, ибо допускают ошибки на стадии проектирования.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.08.2009, 14:28   #29
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Функа GetParamStruct возвращает указатель на интерфейс указанного типа. Тип указывается в параметрах, но черт его знает что она вернет если будет ошибка...
После нехитрой замены получаем:

Функа GetParamStruct возвращает указатель на объект указанного класса. Класс указывается в параметрах, но черт его знает что она вернет если будет ошибка...

Цитата:
Сообщение от Stilet Посмотреть сообщение
P.S. Я не убеждаю отказываться кого-то от интерфейсов. Я всего лишь говорю что они крайне неудобны мне, ибо допускают ошибки на стадии проектирования.
Не вижу никаких проблем, специфичных для интерфейсов.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я то могу привести типы:
Код:
 DocumentParam:=ksDocumentParam(KompasObjectA.GetParamStruct(ko_DocumentParam));
 KompasActiveDocument.ksGetObjParam(KompasActiveDocument.reference,DocumentParam,ALLPARAM);
   result:=DocumentParam.fileName;
 DocumentParam:=nil;
По идее, интерфейсы нужно приводить оператором "as", иначе как бы не получилось так, что указатель переинтерпретируется без проверки на соответствие.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 13.08.2009, 15:04   #30
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
По идее, интерфейсы нужно приводить оператором "as"
Может быть. Я так уж глубоко не вникал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерфейсы Maks1978 Общие вопросы C/C++ 0 29.06.2009 22:11
Паскаль ООП. Примеры программ с использованием ООП SeЯgey Помощь студентам 5 13.05.2009 21:55
Интерфейсы MaZaHaKa Общие вопросы Delphi 1 30.11.2008 19:17
Философия программинга. Cezar Свободное общение 43 15.03.2007 10:49