31.08.2017, 22:58 | #1 |
Banned
|
Какое-то новое 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 |
Участник
|
Может у тебя просто более старая версия приложения?
Какой класс в примере "базовый", и какой метод существует только на "потомке", и каком именно? |
|
|
За это сообщение автора поблагодарили: ax_mct (3). |
01.09.2017, 02:31 | #3 |
Banned
|
Цитата:
Обьявление переменной в потомке: 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 |
Banned
|
O, я все проспал!
[ExtensionOf] != extends то есть это не наследование, а расширение базового класса. То есть все потомки будут иметь этот член, так? Похоже что так. Последний раз редактировалось ax_mct; 01.09.2017 в 02:58. |
|
01.09.2017, 03:13 | #5 |
Участник
|
Да, это совсем не потомок. Это как-бы "partial class", но не совсем.
|
|
01.09.2017, 04:15 | #6 |
NavAx
|
Есть такое дело. ООП уже не модно. Для микро-сервисов и прочего веба это излишне сложно. Поэтому в новомодном GO классов больше нет. Есть структуры, к которым можно цеплять методы-обработчики.
__________________
Isn't it nice when things just work? |
|
01.09.2017, 08:38 | #7 |
Участник
|
Немного похоже на 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 |
Участник
|
Ну это раньше туда пихали именно "extension methods" в понимании C#
Сейчас это уже намного больше. Могут добавлять классу еще состояния, могут добавлять логику к существующим методам класса, могут вызывать protected методы класса, т.д. extension methods как именно синтаксический сахар не интересно даже. |
|
01.09.2017, 11:02 | #9 |
Участник
|
Цитата:
Цитата:
могут вызывать protected методы класса, т.д.
|
|
01.09.2017, 11:04 | #10 |
MCT
|
Цитата:
Сообщение от belugin
Фактически, методы расширения - это синтаксический сахар для утилит (вместо StringUtils::convertToKOI8("test") пишем "test".convertToKOI8()). Так же поля расширения это синтаксический сахар для какой-то более сложной конструкции (вместо GetExtensionOfType<MyInvoiceExtension>(Invoice).myField пишем Invoice.MyField)
__________________
Axapta book for developer |
|
01.09.2017, 11:12 | #11 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: MikeR (5). |
01.09.2017, 11:25 | #12 |
Участник
|
Цитата:
Сообщение от belugin
Насколько я понял, это реализуется при помощи автогенерирования событий и связанных словарей расширений. Наверное не правильно называть это синтакическим сахаром. Тут две вещи - некий FW экстешненов, которые можно реализовать и на C# и поддержка его языком. Попробуй декомпилировать X++ сборку и увидишь код на C# который делает то же самое.
Раньше если добавляешь переменную в класс, то надо инкрементно компилировать, чтобы все наследники пересобрались. Иначе глючит. Если добавляешь параметр в метод то смотришь по перекрестным ссылкам где он вызывается и где перекрыт в наследниках, тоже правишь и компилируешь эти места. Иначе глючит и может падать. Теперь, есть ли какие-то подобные простые правила, что делать при работе с Extension ? Что минимально надо откомпилировать и проверить при добавлении расширений. Глобальную компиляцию не хочется делать на каждый чих. |
|
01.09.2017, 11:31 | #13 |
Участник
|
По идее если не используешь новое, то не надо ничего перекомпилировать кроме того модуля, где сам экстеншен - это ж стандартный .NET. Есть какие-то кеши которые надо флашить, наверное.
|
|
|
За это сообщение автора поблагодарили: Logger (3). |
01.09.2017, 11:31 | #14 |
Участник
|
Цитата:
Сообщение от Logger
А вот интересно.
Раньше если добавляешь переменную в класс, то надо инкрементно компилировать, чтобы все наследники пересобрались. Иначе глючит. Если добавляешь параметр в метод то смотришь по перекрестным ссылкам где он вызывается и где перекрыт в наследниках, тоже правишь и компилируешь эти места. Иначе глючит и может падать. Теперь, есть ли какие-то подобные простые правила, что делать при работе с Extension ? Что минимально надо откомпилировать и проверить при добавлении расширений. Глобальную компиляцию не хочется делать на каждый чих. Хотя, конечно, проверить конкретно этот сценарий не помешало бы. Добавить параметр в метод нельзя.. Собственно, о возможных способах решения пост mfp указанный выше. |
|
|
За это сообщение автора поблагодарили: MikeR (5). |
Теги |
extension framework, extension methods |
|
|