Система: компиляция
[id:26]
X++ — объектно-ориентированный язык программирования. Да вы уже сами догадались об этом. Догадались ли вы о том, что это также интерпретируемый язык? Видимо тоже да. Может удивить вас тем, что результатом компиляции является некий байт-код? А знаете ли вы, что сгенерированный байт-код будет во время исполнения интерпретироваться? И вся эта байткодовая возня ради того, чтобы увеличить скорость ваших решений вы тоже знали?
Сохранение изменений объекта – суть тоже самое, что и компиляция. Скомпилировать объект – это значит, что его также сохранили.
Есть одна неприятная новость, и снова глупенький компилятор. Лучше это прочувствовать самому; поэтому создайте проект с двумя классами в нем:
Код для классов:
class BLG26_BaseClass
{
public int baseMethod(int _i)
{
return _i + _i;
}
}
class BLG26_ChildClass extends BLG26_BaseClass
{
public int baseMethod(int _i)
{
return super(_i) + super(_i);
}
static void main(Args args)
{
BLG26_ChildClass cls = new BLG26_ChildClass();
;
info(strfmt('%1', cls.baseMethod(5)));
}
}
Итак, здесь мы создали два класса — папу и дочку. В дочернем классе перекрыли метод "baseMethod()". И, конечно, создали метод main(), чтобы проверить работу написанного кода. Запустил, увидел цифру 20. Пока все нормально, дальше будет хуже.
Поменяем сигнатуру метода baseMethod() в базовом классе:
class BLG26_BaseClass
{
public real baseMethod(real _i)
{
return _i + _i;
}
}
Компилируйте базовый класс (в дереве проекта щелкните правой кнопкой мыши на классе "BLG26_BaseClass" и во всплывающем меню выберите пункт «Компилировать»). Все в порядке. Откомпилируйте дочерний класс. И снова: все в порядке! Хотя нужно ожидать ошибки. Ведь перегруженный в дочернем классе метод "baseMethod()" по-прежнему работает с целыми числами и вызывает метод "baseMethod()" своего родителя, вполне законно ожидая, что тот тоже работает с целыми числами. А на самом деле папаша уже переметнулся и манипулирует вещественными переменными. Однако компилятор молчит.
Если вы снова выполните метод "main()" дочернего класса, то снова получите цифру 20.
Выход из сложившегося положения — инкрементная компиляция. Для этого щелкните правой кнопкой на родительском классе — "BLG26_BaseClass" —, пункт «Надстройки», «Инкрементная компиляция»:
Это действие занимает несколько больше времени, чем просто компиляция, потому что система заново генерирует байт-код для текущего класса и всех его дочек. И, о, чудо! Ошибка найдена!
Мне было сказано: «ошибка 85, Перегруженная функция имеет неправильный тип возвращаемого значения».
Итог:
- Аксапта исполняет предварительно созданый байт-код;
- инкрементная компиляция поможет в трудную минуту.
Комментариев нет:
Отправить комментарий