![]() |
#1 |
Участник
|
Инкрементная компиляция класса
Здравствуйте.
Выявили проблему, в 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. |
|
![]() |
#2 |
Участник
|
Если я правильно понял, о чем речь
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
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
![]() |
#3 |
Участник
|
Владимир, здравствуйте.
Всё тривиальнее. В Вашей интерпретации ошибка: Class_1_1_1 наследуется от Class_1, а Class_1_1 - брат/сестра. Проблематика в том, что инкрементная компиляция смотрит на регистры символов (выявлено эмпирическим путём). Если в цепочке наследования встречается класс с аналогичным набором символов, компиляция пропускает вывод информации по имеющему большее количество символов классу. Т.е. ClassCaCa extends ClassCa ClassCaCaco extends ClassCa // Здесь компилятор не отобразит ошибку Но заменив регистр в наименовании класса ошибки не возникнет: ClassCaCaCo extends ClassCa // Здесь компилятор отобразит ошибку Последний раз редактировалось Товарищ ♂uatr; 21.04.2025 в 16:17. |
|
![]() |
#4 |
Участник
|
Class_1
Class_1_1 - здесь ошибка Class_1_2 - здесь нет ошибки После исправления в Class_1_1 и заново запущенной инкрементной компиляции ошибка в Class_1_2 не возникнет? Мне, все-таки кажется, что дело не в регистре, а в самом факте изменения. Не важно, какого. Т.е. инкрементная компиляция выполняет компиляцию до первой ошибки и дальше просто не смотрит, если явно не было каких-либо изменений. Изменение регистра - это как раз "было изменение"
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|