12.09.2006, 16:03 | #1 |
Участник
|
Как проверить существование метода у объекта
Как можно проверить, существует ли метод у вызывающего объекта
Пример: PHP код:
|
|
12.09.2006, 16:08 | #2 |
Member
|
Если объект — форма, то вот так Global::formHasMethod(...) можно попробовать.
__________________
С уважением, glibs® |
|
12.09.2006, 16:15 | #3 |
Участник
|
А если объект - класс, как в моем случае?
|
|
12.09.2006, 16:20 | #4 |
Участник
|
\Classes\SysDictClass\hasObjectMethod
\Classes\SysDictClass\hasStaticMethod \Classes\SysDictClass\isMethodActual \Classes\SysDictClass\methodsActualClassId |
|
|
За это сообщение автора поблагодарили: Lucky13 (1). |
12.09.2006, 16:24 | #5 |
Участник
|
Огромное спасибо, то что нужно
|
|
12.09.2006, 17:50 | #6 |
Moderator
|
Единственное, что .... из обасти проектирования.. Вы пытаетесь дернуть метод объекта, который вы получили.... Другими словами, вы ожидаете от него реализации какого-то поведения, функции.... интерфейса....
Я бы создал интерфейс, в своем классе(классах) реализовывал бы этот интерфейс, а у caller бы проверял - реализует ли данный object нужный мне интерфейс. Хотя, в общем то, не принципиально. Как говорится "те же яйца, вид в профиль", но с точки зрения архитектуры и расширяемости решения я бы выбрал этот вариант. |
|
|
За это сообщение автора поблагодарили: ATimTim (1). |
13.09.2006, 09:18 | #7 |
Участник
|
Цитата:
Сообщение от Андре
Единственное, что .... из обасти проектирования.. Вы пытаетесь дернуть метод объекта, который вы получили.... Другими словами, вы ожидаете от него реализации какого-то поведения, функции.... интерфейса....
Я бы создал интерфейс, в своем классе(классах) реализовывал бы этот интерфейс, а у caller бы проверял - реализует ли данный object нужный мне интерфейс. Хотя, в общем то, не принципиально. Как говорится "те же яйца, вид в профиль", но с точки зрения архитектуры и расширяемости решения я бы выбрал этот вариант. Кстати, как в Аксапте проверить реализует ли object некоторый интефейс или нет? |
|
13.09.2006, 09:58 | #8 |
Участник
|
1. внимательно изучите SysDictClass
2. проверка сама по себе CodeSmell (правда Ax не для брезгливых) |
|
13.09.2006, 10:16 | #9 |
Участник
|
Класс SysDictClass я смотрел. С этой точки зрения нет разницы между вызовом метода hasObjectMethod и, скажем, isImplementing. Просто я думал, что Андре имел в виду какой-то другой способ
|
|
02.03.2022, 17:09 | #10 |
Участник
|
Коллеги, разрешите пнуть труп этой ветки глупым вопросом?
Почему для классов, у которых есть нестатитический метод description, hasStaticMethod по нему возвращает разные значения при вызове на клиенте и на серверной стороне? DAX 2009. Последний раз редактировалось dim-gin; 02.03.2022 в 17:10. Причина: Указал версию приложения |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
02.03.2022, 18:00 | #11 |
Участник
|
А почему вы проверяете наличие НЕстатического метода через hasStaticMethod(), когда надо использовать hasObjectMethod()?
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: Pandasama (2). |
02.03.2022, 18:21 | #12 |
Участник
|
Мне надо проверить, что у класса есть статический метод "description". Де-факто его нет. Но есть обычный метод с тем же названием "description". И в этом случае вызванный hasStaticMethod на клиенте возвращает true, а на серверной стороне - false. Вопрос: почему? Правильный код возврата, ессно, false.
|
|
02.03.2022, 19:07 | #13 |
Участник
|
Завтра попробую проверить на AX4, AX2012.
Если у вас несколько АОСов, возможно объект вашего класса не везде успел синхронизироваться и результат может показывать старую информацию. Возможно ваш description сначала был static, а потом это ключевое слово просто убрали?
__________________
// no comments |
|
03.03.2022, 09:16 | #14 |
Участник
|
Причины не знаю, но такое разное поведение у hasStaticMethod, действительно, проявляется (точнее такое проявляется в системном классе DictMethod).
Помню на каком-то из стандартных классов, наследников RunBaseBatch почему-то description был сделан не статическим методом, а методом экземпляра. В итоге при работе в пакете у меня не выводился заголовок. Поэкспериментировал с созданием и вызовом caption джобом на клиенте - работает, а такой же эксперимент на сервере выдавал в возврате caption пустую строку. Для решения моей проблемы достаточно было просто перекрыть caption на этом классе, поэтому дальше копать не стал. |
|
03.03.2022, 09:46 | #15 |
Участник
|
AX2009
Проверил. Воспроизвелось! Статический метод после удаления или переименования не удаляется и продолжает существовать и даже вызываться (посредством рефлексии SysDictClass.СallStatic) и возвращать старое значение. Даже отладка работает и дебагер показывает код старого уже удалённого метода. Возможно переиндексация файлов приложения или рестарт AOS это лечит, но я не проверял Последний раз редактировалось S.Kuskov; 03.03.2022 в 09:49. |
|
|
За это сообщение автора поблагодарили: dim-gin (1). |
14.03.2022, 21:32 | #16 |
Участник
|
Простите, что пропал. Нет, класс старый (но не стандарт), не менялся тонну лет, рестартов всех AOS'ов после последнего изменения было много.
|
|
14.03.2022, 22:16 | #17 |
Участник
|
Погонял на тесте, подёргал службы: видимо, трабла была таки в кэшах.
Пересоздание индексных файлов, ессно, помогло, но в системе 24/7 это особо не попрактиковать. |
|
15.03.2022, 12:59 | #18 |
Боец
|
X++: SysFlushAOD::doFlush(); |
|
17.03.2022, 10:15 | #19 |
Участник
|
Интересная вещь творится (в AX4).
Случай похожий, поэтому сюда пишу. Вот есть метод в базовом классе, ничего не менял, не трогал. Да и код на другом слое просто не позволяет ничего сделать. X++: void parmRecId(RecId _recId = 0)
{
;
recId = _recId;
} X++: RecId parmRecId(RecId _recId = recId)
{
;
recId = _recId;
return recId;
} Ситуация не из простых, когда код находится на слое VAR. У нас многие классы написаны другой компанией-внедренцем очень и очень небрежно, и мы с 2008 года поддерживаем этот legacy и по сей день исправляем баги. Иногда приходится просто мириться с тем, что невозможно изменить сигнатуру метода. В более сложных случаях - создаем новые классы, старые помечаем как obsolete, аккуратно меняем все вызовы в системе и не трогаем более.
__________________
// no comments Последний раз редактировалось dech; 17.03.2022 в 10:18. |
|
17.03.2022, 11:39 | #20 |
Участник
|
dech, а инкрементальная компиляция не помогает?
|
|
Теги |
formhasmethod, sysdictclass, метод, проверка |
|
|