Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как узнать есть ли у объекта метод? (число прочтений - 16817 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Как узнать есть ли у объекта метод?
15. Сентября 2006 :: 08:05
Печать  
В процедуру передаются объекты двух классов, у них названия методов немного различаются. Нужно как-то проверить наличие метода перед его вызовом. Можно ли так сделать?
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #1 - 15. Сентября 2006 :: 08:10
Печать  
Код
Выбрать все
Если ТипЗначенияСтр(объект)="ПервыйОбъект" Тогда
    объект.Метод1();
Иначе
    объект.МетодОдин();
КонецЕсли;
 



Код
Выбрать все
Попытка
    объект.Метод1();
Исключение
    объект.МетодОдин();
КонецПопытки;
 

  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #2 - 15. Сентября 2006 :: 08:56
Печать  
Но я давно планирую добавить спец.класс "Информер/Информатор", у которого будет данный метод.
Имхо он нужен.
Например, при работе с групповым контекстом, чтобы не пользоваться попыткой.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #3 - 15. Сентября 2006 :: 10:13
Печать  
спасибо
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #4 - 15. Сентября 2006 :: 10:47
Печать  
es3000 писал(а) 15. Сентября 2006 :: 08:05:
В процедуру передаются объекты двух классов, у них названия методов немного различаются. Нужно как-то проверить наличие метода перед его вызовом. Можно ли так сделать?

А классический полиморфизм не подходит? Единый интерфейс классов сделать можно?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #5 - 15. Сентября 2006 :: 10:49
Печать  
artbear писал(а) 15. Сентября 2006 :: 08:56:
Но я давно планирую добавить спец.класс "Информер/Информатор", у которого будет данный метод.
Имхо он нужен.
Например, при работе с групповым контекстом, чтобы не пользоваться попыткой.

Может, просто доработать MetaInfoClasses::МетодСуществует(<стрИмяКласса>,<стрИмяМетода>)?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #6 - 18. Сентября 2006 :: 08:16
Печать  
ИМХО
Если алгоритм подразумевает, что ему передается объект, поддерживающий метод "НекийМетод", и ему приходит объект, не поддерживающий этот метод, то такую ситуацию следут трактовать как ошибку, и добиваться того, что бы ситуация впредь не повторялась, путем правки консерватории, а не лепить заплатки, "здесь играем, здесь не играем, а здесь рыбу заворачивали".
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #7 - 18. Сентября 2006 :: 08:39
Печать  
Правильно, такая ситуация является ошибочной. И ее надо как-то обработать.
Например на C# такая ситуация вообще исключена, там проверка типов выполняется при компиляции.

А раз уж 1С позволяет обращаться к объектам без проверки типов, то такие ситуации надо обрабатывать самому, а не пытаться обратиться при помощи конструкции "Попытка / Исключение" неизвестно куда. А для этого хорошо бы определить что это за объект, и обеспечивает ли он ожидаемое поведение.

В технологии COM для этого используются интерфейсы. Я получаю указатель на интерфейс, и потом запрашиваю у него нужное мне поведение.

На 1С можно проверить тип объекта, а можно попробовать определить есть ли нужный метод. Я не говорю что этот способ правильный.
Но сама идея, чтобы объект мог как-то сообщить о том что он из себя представляет, является разумной.
  
Наверх
ICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #8 - 18. Сентября 2006 :: 11:12
Печать  
es3000
А чем, собственно, проверка типа не устраивает?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #9 - 18. Сентября 2006 :: 11:24
Печать  
А если несколько классов реализуют одно и тоже поведение? Проверка типов будет очень длинной. К тому же ее каждый раз придется дополнять при появлении нового класса с такой же функциональностью
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #10 - 18. Сентября 2006 :: 11:48
Печать  
Тут с дизайна бы начать...
  

De quelle planète es-tu?
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #11 - 18. Сентября 2006 :: 12:02
Печать  
es3000 писал(а) 18. Сентября 2006 :: 11:24:
А если несколько классов реализуют одно и тоже поведение? Проверка типов будет очень длинной. К тому же ее каждый раз придется дополнять при появлении нового класса с такой же функциональностью

А я вот не проверяю нифига. У меня тесты есть для этого.
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #12 - 18. Сентября 2006 :: 12:22
Печать  
es3000 писал(а) 18. Сентября 2006 :: 08:39:
А раз уж 1С позволяет обращаться к объектам без проверки типов, то такие ситуации надо обрабатывать самому, а не пытаться обратиться при помощи конструкции "Попытка / Исключение" неизвестно куда. А для этого хорошо бы определить что это за объект, и обеспечивает ли он ожидаемое поведение.

Ты недопонял, что я хотел сказать.
Как раз и не надо никаких ПопытокИсключений, и Если ТипЗначения.
Я пишу
об.Метод();
и все.
Если вдруг оказалось, что пришел объект без Метод(), вывалится ошибка, и дальше уже надо разбираться, как так вышло, что пришел объект без Метод(), а не городить огород с попытками.
  
Наверх
 
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #13 - 18. Сентября 2006 :: 14:08
Печать  
kms писал(а) 18. Сентября 2006 :: 11:48:
Тут с дизайна бы начать...


Поддерживаю.
  
Наверх
ICQ  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #14 - 18. Сентября 2006 :: 14:49
Печать  
Я вот тоже подумывал о реализации интерфейсов, но, похоже, 1С++ еще не дорос до этого уровня.

А пока я согласен с Орефковым. Если в коде объект.Метод() произошла ошибка, значит надо найти откуда она выросла.

И кстати, в качестве интерфейса достаточно определить пустой класс, наследовать от него и включить контроль типов. Тогда все эти ошибки и вылезут.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать