AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.02.2013, 13:27   #1  
Кирилл
Гость
 
n/a
Как в методе базового класса перечислить классы потомки
Добрый день,
как в методе базового класса перечислить классы-наследники и создать их экземпляры?

Хочу провести эксперимент с методом construct.
Обычно в этом методе происходит анализ некого контекста (например поступившей на вход таблицы или енума) и по итогам этого анализа создается экземпляр нужного наследника.
Если мы допилили еще одного наследника, приходится допиливать и construct в базовом классе.
А что если возложить бремя анализа на самих наследников и в constuct опрашивать их на предмет того, нравится ли им текущий контекст, согласны ли они поработать.

P.S. Наследников наследников тоже хотелось бы перечислить.
Старый 13.02.2013, 13:38   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
DictClass.extendedBy() - и работать со списком.
У найденных классов, соответственно, так же дергать extendedBy()

Вот только, овчинка выделки не стоит, имха
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили:  (1).
Старый 13.02.2013, 13:42   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,326 / 3556 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Штатно, имеются 2 способа.
1. Берем список всех классов (класс Dictionary, методы classCnt, classCnt2Id), перебираем их в цикле и смотрим на свойство extends. Если оно указывает на наш класс - значит это наследник. Если не на наш - значит пропускаем. Соответственно - сделав тут рекурсию - мы получим список наследников и наследников наследников.
Скорость работы п.1 хорошо заметна - когда мы создаем новый Shared Project. Система ищет всех наследников класса ProjectNode и список наследников выводит в качестве пунктов меню. И это еще без наследников наследников. Само собой - речь идет о первой попытке создания Shared Project после входа в АХ. Затем это кешируется.

2. Иерархия объектов (пункт меню из контекстного меню Надстройки из АОТ). Она ориентирована на то, что можно изначально заполнить спецтабличку (xrefTypeHierarchy) из формы построения перекрестных ссылок, а затем уже выбирать оттуда информацию гораздо быстрее, чем с помощью п.1

Я иногда задумываюсь - а не станет ли облегчение программирования в будущем усложнением в другом месте? Т.е. вроде как все знают - добавил наследника - он не активируется, пока его не пропишешь в конструкторе. А тут он взял и сам прицепился. Нетипичное поведение по сравнению с другим кодом. Что усложняет процесс изучения кода.

ЗЫ. Пока писал - уже AndyD ответил. Его вариант - наверное даже лучше, чем мой п.1
__________________
Возможно сделать все. Вопрос времени
Старый 13.02.2013, 15:06   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от AndyD Посмотреть сообщение
У найденных классов, соответственно, так же дергать extendedBy()
На Ax2012, по крайней мере, параметр allLevels по умолчанию true - то есть у найденных уже не надо дергать.

Цитата:
Вот только, овчинка выделки не стоит, имха
Так сделан механизм расширения бухгалтерских правил в Ax 2012. Это позволяет несколько уменьшить количество кода, который надо просматривать при мердже изменений.

Только чтоб это быстро работало применяется агрессивное кеширование.
Старый 13.02.2013, 16:37   #5  
Кирилл
Гость
 
n/a
Navision
Цитата:
Сообщение от belugin Посмотреть сообщение
Так сделан механизм расширения бухгалтерских правил в Ax 2012. Это позволяет несколько уменьшить количество кода, который надо просматривать при мердже изменений.

Только чтоб это быстро работало применяется агрессивное кеширование.
Агрессивное это как?
Я еще в AX2009 работаю, не могу посмотреть пример.

У меня случай простейший, нужный класс определяется TableId переданной записи.
Первое, что пришло в голову для кэширования, сделать постоянную таблицу с соответствием TableId и ClassId.
Если класс не найден в ней, то автоматом заполнить таблицу с помощью перебора extendedBy(), если не помогло, то выкинуть ошибку.

Если вдруг у другого базового будет такая же тема с TableId - ClassId, добавим еще поле BaseClassId и поиск в конструкторе будем осуществлять в его разрезе.
Старый 13.02.2013, 17:27   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Агрессивное, значит кешируют все, до чего могут дотянуться.

Там соответствие классов параметрам делается с помощью атрибутов, которых нет в X++ в Ax 2009.

Но в принципе можно сделать и статический метод.
Старый 14.02.2013, 07:48   #7  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Создание класса будет работать дико медленно. Ребят, вам что жалко construct() допилить? Вам что важнее, скорость или эстетство?
__________________
// no comments
Старый 14.02.2013, 08:30   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Кирилл Посмотреть сообщение
Если класс не найден в ней, то автоматом заполнить таблицу с помощью перебора extendedBy(), если не помогло, то выкинуть ошибку.
Не не. Лучше сразу выкидывать ошибку. А для поиска новых классов сделать отдельную переодическую операцию. В противном случае процесс создания экземпляра класса становится не детерминированным. Сегодня всё работает быстро, а завтра начинаются тормоза или вообще ошибки вырастают на ровном месте. Для не искушённого пользователя такие перепады "настроения" системы сложно как-то оправдать. Чем прозрачнее процесс, тем проще его контролировать.

Цитата:
Сообщение от dech Посмотреть сообщение
Создание класса будет работать дико медленно. Ребят, вам что жалко construct() допилить? Вам что важнее, скорость или эстетство?
Угу.

Отказ от протягивания динамических связей в пользу статического метода construct приводит к ещё более прозрачному процессу. В конце концов появление новых классов потомков у вас же не поставленно на поток и не происходит автоматически?

Конечно необходимость внесения изменений в construct родительского класса при появленим очередного потомка вносит некоторые неудобства в процесс слияния нескольких модификаций. К слову, в AX20012 появилась возможность вешать свои обработчики на событие вызова метода, без изменения самого метода. Это должно помочь избежать описанных неудобств.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
В Стандартной АХ2009 не работает кнопка <Параметры> на диалоге класса унаследованного от RunBaseReport Pustik DAX: Программирование 3 11.05.2011 19:47
Вызов метода базового класса Eldar9x DAX: Программирование 15 22.03.2008 19:10
передача курсора в два класса kitty DAX: Программирование 3 09.08.2006 13:21
Баг в методе класса OLAPCreateSchema Косых Артём DAX: Программирование 2 28.04.2006 12:20
Запустить метод класса loka DAX: Программирование 2 13.03.2006 15:40

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:13.