Система: компиляция
[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, Перегруженная функция имеет неправильный тип возвращаемого значения».
Итог:
- Аксапта исполняет предварительно созданый байт-код;
- инкрементная компиляция поможет в трудную минуту.
Комментариев нет:
Отправить комментарий