Переключение на Главную Страницу Страницы: 1 2 [3]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как узнать есть ли у объекта метод? (число прочтений - 16320 )
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #30 - 19. Сентября 2006 :: 13:12
Печать  
es3000 писал(а) 19. Сентября 2006 :: 12:42:
А начать можно с чего-нибудь типа "МетодСуществует" Улыбка

Ты будешь долго смеяться, но такой метод уже есть - у класса MetaInfoClasses. Хотя и имеет ограниченную ценность: Цитата:
метод работает, только для тех методов, которые были определенных в файлах - определений классов (*.prm).
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #31 - 19. Сентября 2006 :: 13:56
Печать  
Если автор хочет, чтобы класс сам рассказывал о том, является ли он уткой или нет - наверное ему стоит подумать о внедрении в сам класс (во все его классы) метода (методов), которые и будут отвечать на поставленный вопрос. ЯУтка(), ЯСлон(), ЯХобот() и так далее.

Проблемы две.
1. Поскольку ответ может быть и отрицательным - нужно наследовать все классы от некоторого базового класса, который реализует ВСЮ тонну этих методов и возвращает ложь из каждого.
2. Даже положительный ответ на вопрос ЯУтка() не гарантирует наличия у класса метода Крякать(). Программист мог просто ошибиться и забыть про него.

Стоит ли городить весь этот огород ради сомнительного удовольствия сомнительной универсальности - решать каждому самостоятельно.
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #32 - 19. Сентября 2006 :: 15:31
Печать  
es3000 писал(а) 19. Сентября 2006 :: 11:04:
sedmin
В общем согласен насчет исключений, но создавать обработчик исключения с целью проверить наличие метода - это уже слишком


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

Например, у тебя будут неверные результаты работы программы. И ты будешь долго искать, почему так получилось. Это разве лучше? Ошибка должна проявляться как можно раньше. Иначе отладка программы превращается в мучение.

Цитата:
Цитата:
Так интерфейсы - это и есть еще одна (или не одна) иерархия

Да, иерархия, но иерархия поведения, не связанная с реализацией, что как раз и требуется


Так пожалуйста. 1С++ поддерживает множественное наследование. Так что никто не мешает тебе реальные классы наследовать в том числе от пустых - интерфейсов.

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

Вывод. Плохо, когда не возникает исключений там, где они должны быть.

PPS. О! Кстати! Сегодня не менее часа искал ошибку. Оказалость в вызове метода пропустил запятую. Стоило включить проверку типов - и ошибка как на ладони!
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

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

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #34 - 21. Сентября 2006 :: 13:20
Печать  
Я не против метода. Я против неправильного его использования.

С другой стороны, чувствую, что есть подвох в твоем варианте использования, но пока не знаю какой.  Улыбка
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #35 - 21. Сентября 2006 :: 13:41
Печать  
sedmin писал(а) 21. Сентября 2006 :: 13:20:
Я не против метода. Я против неправильного его использования.

+1

sedmin писал(а) 21. Сентября 2006 :: 13:20:
С другой стороны, чувствую, что есть подвох в твоем варианте использования, но пока не знаю какой.  Улыбка

Да нет тут никакого подвоха. Нормальное желание расширить стандартный обработчик события, если таковой имеется.

Подвох если и может спрятаться, то только опять же в неправильном использовании Улыбка
  
Наверх
www  
IP записан
 
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #36 - 28. Сентября 2006 :: 11:32
Печать  
ИМХО, если метод проверки наличия метода Улыбка  будет - никому от этого хуже не станет. На сегодняшний момент "Попытка" является единственным гарантированным методом определения. К сожалению, введя обработку исключений, в 1С не озаботились определением типа возникшего исключения. Потому нельзя сказать, возникло ли исключение потому что метода нет, или в самом методе ошибка. Наверно, именно это имели в виду предыдущие ораторы, когда орали на попытку.

Чтоб реабилитировать попытку и утиные интерфейсы, приведу контр-пример (считаем, что 1С++/формэкс у нас нет): необходимо выполнять некие действия над справочником/документом, действия выбираются из меню, меню вызывается по кнопке на форме. При этом часть действий одинаковая для объектов разного типа, часть - различная (например, справочник провести нельзя). Кнопка может располагаться  в формах: документа, элемента справочника; а также в списках(журналах) - в  последнем случае должны вызываться действия над текущей записью. 
Так вот, логично было бы все это дело оформить как процедуру в ГМ, а в формы повставлять кнопку с ее вызовом с передачей контекста. Однако тут встает проблема определения допустимых действий: по типу-низя (ТипЗначения переданного контекста - ГрупповойКонтекст). Можно конечно еще одним параметром передать "что это" (но чем меньше параметров, тем лучше), или вообще сделать разные процедуры для разных форм (но тогда дублируем код для общих действий). Вот-тут то и подойдет "Попытка" как средство определения типа:
Код
Выбрать все
Попытка
    Конт.НачалоИнтервала();
	Объект=Конт.ТекущийДокумент;
	ЭтоДок=1;
	ЭтоСписок=1;
Исключение
	Попытка
	    Объект=Конт.ТекущийДокумент();
		ЭтоДок=1;
	Исключение
		Попытка
		    Объект=Конт.ТекущийЭлемент();
			ЭтоСпр=1;
		Исключение
			ЭтоКакаяТоФигня=1;
			Возврат;
		КонецПопытки;
		Попытка
		    Конт.ПолучитьОтбор();
			ЭтоСписок=1;
		Исключение
		КонецПопытки;
	КонецПопытки;
КонецПопытки;
 


Вот такая вот лесенка. Если ходит как утка и крякает, как утка - то это утка и есть. И значит плавать должна тоже.
  

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 
ОтправитьПечать