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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.08.2017, 22:58   #1  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Какое-то новое Pontoppidan OOП в AX7
У нас какое-то новое ООП которое я умудрился проспать. Возможно что даже это изобретение ожидающее патента.

Экземпляр родительского класса спокойно вызывает метод существующий только в потомке. В моей реальности компилятор такое пропустить не должен как и мой мозг. Со мной что-то не так?

https://blogs.msdn.microsoft.com/mfp...od-signatures/






https://blogs.msdn.microsoft.com/mfp...g-class-state/

X++:
[ExtensionOf(classStr(SysUserLogCleanup))]
final class mfpSysUserLogCleanup_Extension
{
    // Extending class state...
    private boolean mfpArchive;
    private DialogField mfpDialogArchive;
    
    // Adding new instance methods...
    private void mfpDialog(Dialog _dialog)
    {
        mfpDialogArchive = _dialog.addField(extendedtypestr(NoYesId), "Archive");
        mfpDialogArchive.value(mfpArchive);
    }
    private void mfpGetFromDialog()
    {
        mfpArchive = mfpDialogArchive.value();
    }


    // Wiring up event handlers...
    [PostHandlerFor(classStr(SysUserLogCleanup), methodStr(SysUserLogCleanup, dialog))]
    public static void mfpSysUserLogCleanup_Post_Dialog(XppPrePostArgs _args)
    {
        Dialog dialog = _args.getReturnValue();
        SysUserLogCleanup instance = _args.getThis();
        instance.mfpDialog(dialog);
    }


    [PostHandlerFor(classStr(SysUserLogCleanup), methodStr(SysUserLogCleanup, getFromDialog))]
    public static void mfpSysUserLogCleanup_Post_GetFromDialog(XppPrePostArgs _args)
    {
        SysUserLogCleanup instance = _args.getThis();  
        instance.mfpGetFromDialog();
    } 
}
За это сообщение автора поблагодарили: macklakov (5).
Старый 01.09.2017, 01:16   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Может у тебя просто более старая версия приложения?

Какой класс в примере "базовый", и какой метод существует только на "потомке", и каком именно?
За это сообщение автора поблагодарили: ax_mct (3).
Старый 01.09.2017, 02:31   #3  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Может у тебя просто более старая версия приложения?

Какой класс в примере "базовый", и какой метод существует только на "потомке", и каком именно?
В первом примере
Обьявление переменной в потомке:
X++:
class SalesLineType_NewType extends SalesLineType
{
	public boolean myExtraData;	
}
Использование:
X++:
SalesLineType salesLineType = salesLine.type(); // родительский тип
salesLineType.myExtraData = true; // обращение к члену потомка через экземпляр родительского типа
Должно быть
X++:
SalesLineType_NewType salesLineType = salesLine.type();
Не?

Пример 2
Обьявление метода в потомке:
X++:
SysUserLogCleanup_Extension extends SysUserLogCleanup
{
    private void mfpGetFromDialog()
    {
    } 
}
Использование:
X++:
SysUserLogCleanup instance = _args.getThis();  // родительский тип
instance.mfpGetFromDialog(); // вызов метода потомка через экземпляр родительского типа
При отсутствии данного метода в родительском классе (или в обязательном интерфейсе но это не суть)
другой потомок SysUserLogCleanup_AnotherExtension может и не иметь этот метод mfpGetFromDialog().
Для этого компилятор и существует.

В моей реальности это должно быть
X++:
SysUserLogCleanup_Extension instance = _args.getThis();
иначе компилятор не должен такое пропускать.

В связи с чем и вопрос я может какой патент пропустил?
Это не опечатка у него в двух примерах, это что-то другое.

Последний раз редактировалось ax_mct; 01.09.2017 в 02:33.
Старый 01.09.2017, 02:56   #4  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
O, я все проспал!

[ExtensionOf] != extends то есть это не наследование, а расширение базового класса.

То есть все потомки будут иметь этот член, так? Похоже что так.

Последний раз редактировалось ax_mct; 01.09.2017 в 02:58.
Старый 01.09.2017, 03:13   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от ax_mct Посмотреть сообщение
O, я все проспал!

[ExtensionOf] != extends то есть это не наследование, а расширение базового класса.

То есть все потомки будут иметь этот член, так? Похоже что так.
Да, это совсем не потомок. Это как-бы "partial class", но не совсем.
Старый 01.09.2017, 04:15   #6  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,263 / 982 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от ax_mct Посмотреть сообщение
У нас какое-то новое ООП которое я умудрился проспать.
Есть такое дело. ООП уже не модно. Для микро-сервисов и прочего веба это излишне сложно. Поэтому в новомодном GO классов больше нет. Есть структуры, к которым можно цеплять методы-обработчики.
__________________
Isn't it nice when things just work?
Старый 01.09.2017, 08:38   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Да, это совсем не потомок. Это как-бы "partial class", но не совсем.
Немного похоже на partial class. Partial class это просто способ хранить описание класса в двух файлах. Используется обычно при кодогенерации. Например редактор формы фигачит в один файл и программер его не трогает (потому, что знает, что редактор формы все перетрет), а ручками пишет в другой.


1) Прочитайте и поймите что такое extension method.
2) Генерализируйте это на остальные члены класса.

C# тоже движется в этом направлении.

Фактически, методы расширения - это синтаксический сахар для утилит (вместо StringUtils::convertToKOI8("test") пишем "test".convertToKOI8()).

Так же поля расширения это синтаксический сахар для какой-то более сложной конструкции (вместо GetExtensionOfType<MyInvoiceExtension>(Invoice).myField пишем Invoice.MyField)

Последний раз редактировалось belugin; 01.09.2017 в 08:44.
Старый 01.09.2017, 10:00   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Ну это раньше туда пихали именно "extension methods" в понимании C#
Сейчас это уже намного больше. Могут добавлять классу еще состояния, могут добавлять логику к существующим методам класса, могут вызывать protected методы класса, т.д.

extension methods как именно синтаксический сахар не интересно даже.
Старый 01.09.2017, 11:02   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Могут добавлять классу еще состояния, могут добавлять логику к существующим методам класса,
Насколько я понял, это реализуется при помощи автогенерирования событий и связанных словарей расширений. Наверное не правильно называть это синтакическим сахаром. Тут две вещи - некий FW экстешненов, которые можно реализовать и на C# и поддержка его языком. Попробуй декомпилировать X++ сборку и увидишь код на C# который делает то же самое.

Цитата:
могут вызывать protected методы класса, т.д.
Вот это интересно как устроено (они точно могут наледоваться от кого-то кроме расширяемого класса?)
Старый 01.09.2017, 11:04   #10  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от belugin Посмотреть сообщение

Фактически, методы расширения - это синтаксический сахар для утилит (вместо StringUtils::convertToKOI8("test") пишем "test".convertToKOI8()).

Так же поля расширения это синтаксический сахар для какой-то более сложной конструкции (вместо GetExtensionOfType<MyInvoiceExtension>(Invoice).myField пишем Invoice.MyField)
Эта отрава я правильно понимаю из java сюда попала?
__________________
Axapta book for developer
Старый 01.09.2017, 11:12   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от MikeR Посмотреть сообщение
Эта отрава я правильно понимаю из java сюда попала?
Начальная идея (extension methods) C# остальное не знаю - местное наверное
За это сообщение автора поблагодарили: MikeR (5).
Старый 01.09.2017, 11:25   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от belugin Посмотреть сообщение
Насколько я понял, это реализуется при помощи автогенерирования событий и связанных словарей расширений. Наверное не правильно называть это синтакическим сахаром. Тут две вещи - некий FW экстешненов, которые можно реализовать и на C# и поддержка его языком. Попробуй декомпилировать X++ сборку и увидишь код на C# который делает то же самое.
А вот интересно.
Раньше если добавляешь переменную в класс, то надо инкрементно компилировать, чтобы все наследники пересобрались. Иначе глючит.
Если добавляешь параметр в метод то смотришь по перекрестным ссылкам где он вызывается и где перекрыт в наследниках, тоже правишь и компилируешь эти места. Иначе глючит и может падать.

Теперь, есть ли какие-то подобные простые правила, что делать при работе с Extension ? Что минимально надо откомпилировать и проверить при добавлении расширений. Глобальную компиляцию не хочется делать на каждый чих.
Старый 01.09.2017, 11:31   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Logger Посмотреть сообщение
Теперь, есть ли какие-то подобные простые правила, что делать при работе с Extension ? Что минимально надо откомпилировать и проверить при добавлении расширений. Глобальную компиляцию не хочется делать на каждый чих.
По идее если не используешь новое, то не надо ничего перекомпилировать кроме того модуля, где сам экстеншен - это ж стандартный .NET. Есть какие-то кеши которые надо флашить, наверное.
За это сообщение автора поблагодарили: Logger (3).
Старый 01.09.2017, 11:31   #14  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Logger Посмотреть сообщение
А вот интересно.
Раньше если добавляешь переменную в класс, то надо инкрементно компилировать, чтобы все наследники пересобрались. Иначе глючит.
Если добавляешь параметр в метод то смотришь по перекрестным ссылкам где он вызывается и где перекрыт в наследниках, тоже правишь и компилируешь эти места. Иначе глючит и может падать.

Теперь, есть ли какие-то подобные простые правила, что делать при работе с Extension ? Что минимально надо откомпилировать и проверить при добавлении расширений. Глобальную компиляцию не хочется делать на каждый чих.
By definition, нужно компилировать только ту модель, в которой ты добавляешь extension. Представь, что application code у тебя представлен просто dll'кой.
Хотя, конечно, проверить конкретно этот сценарий не помешало бы.

Добавить параметр в метод нельзя.. Собственно, о возможных способах решения пост mfp указанный выше.
За это сообщение автора поблагодарили: MikeR (5).
Теги
extension framework, extension methods

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
sertandev: Using 3rd party Web components in AX7; an introduction to extensible controls Blog bot DAX Blogs 0 28.08.2017 19:11
Tayfun Sertan Yaman: Using 3rd party Web components in AX7; an introduction to extensible controls Blog bot DAX Blogs 0 28.08.2017 13:11
patrickmouwen: 1yr with AX7 Data Management – My top 12 learnings Blog bot DAX Blogs 2 12.10.2016 15:14
patrickmouwen: AX7 – My top 12 highlights Blog bot DAX Blogs 0 27.02.2016 13:11
mfp: What is new in X++ in AX7? Blog bot DAX Blogs 2 10.02.2016 00:29

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

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

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