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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.04.2025, 12:44   #1  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
317 / 878 (30) +++++++
Регистрация: 23.10.2012
Инкрементная компиляция класса
Здравствуйте.
Выявили проблему, в 2009 (далее будут представлены нетипичные названия для классов - это сделано намеренно и прекрасно отражает душевное состояние автора на тему богатого багового наследия MS):
Было 3 класса:
Класс ClassCa - родитель;
Класс ClassCaCa - ребёнок от ClassCa;
Класс ClassCaCaco - ребёнок от ClassCa.
У родителя только 1 функция (для простоты описания), функция koko.
У обоих детей она перекрыта и вызывает логику базового (super).

Осуществили действие - переименовали в родителе функцию с koko на caco.
Делаем инкрементную компиляцию и в логе ошибок получаем только информацию о том, что в ребёнке ClassCaCa недопустимый вызов super'a, а про класс ClassCaCaco ни слова.
Теперь "фишка". Если скорректировать название 2-го ребёнка с использованием верхнего регистра (или создать сразу), ClassCaCaCo - инкрементная найдёт ошибку.
Кому-то знакома данная "фишка" ядра?

Последний раз редактировалось Товарищ ♂uatr; 21.04.2025 в 12:54.
Старый 21.04.2025, 14:48   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,711 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если я правильно понял, о чем речь

Class_1 - Method_1
Class_1_1 - Method_1 (super())
Class_1_1_1 - Method_1 (super())

Переименовываем в базовом классе Class_1 метод Method_1 в Method_2

С точки зрения Axapta произошло следующее

Class_1
1. Удалили метод Method_1
2. Создали метод Method_2

Class_1_1
1. В существующем методе Method_1 указан super(), но в родителе Class_1 метода Method_1 уже нет - ошибка

Class_1_1_1
1. В существующем методе Method_1 указан super(). В классе-родителе Class_1_1 метод с именем Method_1 существует - ошибки нет

Но! Тут есть "тонкость". В классе-родителе Class_1_1 метод Method_1 содержит ошибку. А вот как интерпретировать факт наличия/отсутствия метода в классе-родителе, если он содержит ошибку - вопрос не однозначный.

Скорее всего, любая модификация класса Class_1_1_1 (например, изменение регистра в названии класса) приведет к перезапросу интерфейса класса-родителя. И хотя физически метод Method_1 в классе-родителе есть, но он содержит ошибку. Значит, обращение к нему в super() также будет ошибкой.

Т.е. некая логика во всем этом есть.

PS: Честно говоря, не вижу проблемы. Ведь Class_1_1 все-равно придется поправить. И после правки, уже гарантировано будет ошибка в Class_1_1_1
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 21.04.2025, 16:13   #3  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
317 / 878 (30) +++++++
Регистрация: 23.10.2012
Владимир, здравствуйте.
Всё тривиальнее.
В Вашей интерпретации ошибка:
Class_1_1_1 наследуется от Class_1, а Class_1_1 - брат/сестра.
Проблематика в том, что инкрементная компиляция смотрит на регистры символов (выявлено эмпирическим путём). Если в цепочке наследования встречается класс с аналогичным набором символов, компиляция пропускает вывод информации по имеющему большее количество символов классу.

Т.е.
ClassCaCa extends ClassCa
ClassCaCaco extends ClassCa // Здесь компилятор не отобразит ошибку

Но заменив регистр в наименовании класса ошибки не возникнет:
ClassCaCaCo extends ClassCa // Здесь компилятор отобразит ошибку

Последний раз редактировалось Товарищ ♂uatr; 21.04.2025 в 16:17.
Старый 21.04.2025, 17:54   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,711 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Class_1
Class_1_1 - здесь ошибка
Class_1_2 - здесь нет ошибки

После исправления в Class_1_1 и заново запущенной инкрементной компиляции ошибка в Class_1_2 не возникнет?

Мне, все-таки кажется, что дело не в регистре, а в самом факте изменения. Не важно, какого.

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

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
setTimeOut() не работает в классе, если экземпляр класса создан через вызов MenuFunction AR® DAX: Программирование 10 22.05.2013 16:53
Вызов метода базового класса Eldar9x DAX: Программирование 15 22.03.2008 19:10
передача курсора в два класса kitty DAX: Программирование 3 09.08.2006 13:21
Запустить метод класса loka DAX: Программирование 2 13.03.2006 15:40
Инкрементная компиляция после установки SP3 Shirmin Oleg DAX: Администрирование 7 04.06.2004 13:02

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

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

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