|
![]() |
#1 |
Участник
|
gl00mie
Как мне кажется, происходит путаница понятий В системе Axapta создание объекта - это команда X++: myVar = new MyObject() Т.е. внутри метода new() экземпляр объекта уже существует. Внутри метода new() объекта вполне допустимо обращение к методам этого объекта через this.MyMethod(). На всякий случай напомню, что речь идет о классах, а не о формах или отчетах. Это означает, что конструирование объекта Axapta происходит ДО вызова метода new() этого же объекта. Просто разработчики Axapta предоставили возможность ПОСЛЕ конструирования объекта добавить некий код. По сути, new() - это событие, т.е. некий программный код, который выполняется автоматически, при подаче команды new на создание объекта. А вот метод init() - это именно метод. Т.е. некий программный код, который надо запускать на выполнение явно. Специальной командой. Автоматического выполнения метода init() никогда не происходит. Только явно по команде. С точки зрения разработчика - нет никакой разницы где именно писать код инициализации параметров объекта. В событии new() объекта или в методе init(). Отличия между ними только и исключительно в способе вызова. Выполнение new() произойдет автоматически, а для выполнения init() надо подать специальную команду. Как следствие, выполнение init() можно отложить, чтобы выполнить, например, ряд проверок. Или же вызвать метод init() повтороно, для переинициализации всех свойств объекта. А выполнение new() отложить невозможно. Следовательно, логично в событии new() объекта делать безусловную инициализацию свойств объекта (значения по умолчанию для переменных). А в методе init() выполнять "условную" инициализацию свойств с последующим анализом значения, возвращаемого этим методом для принятия решения о дальнейшей работе с этим объектом. PS: А насчет того, что переменная myVar не существует пока не будет завершена команда new MyObject(), так к обсуждаемой проблеме это не имеет никакого отношения. То же самое будет и с любой переменной, значение которой вычисляется в каком-либо методе любого класса. Пока вычисления не завершены, естесственно, значение не известно. |
|
|
За это сообщение автора поблагодарили: alex55 (1). |
![]() |
#2 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
![]() Как мне кажется, происходит путаница понятий. В системе Axapta создание объекта - это команда
X++: myVar = new MyObject() Цитата:
![]() К слову, в зависимости от реализации класса обращения к тем или иным методам внутри конструктора могут привести к некорректным результатам, если методы предполагают, что конструктор уже отработал, и какие-то внутренние структуры или объекты уже инициализированы - это опять же к вопросу о том, когда кусок выделенной памяти становится объектом. Цитата:
Если посмотреть, что происходит непосредственно в ядре, то увидим следующее:
Цитата:
По поводу контрактной модели см., например, Объектно-ориентированный анализ и проектирование Гради Буча. Последний раз редактировалось gl00mie; 09.07.2008 в 15:12. Причина: typo |
|
|
За это сообщение автора поблагодарили: mazzy (2), konopello (2), Evgeniy2020 (2). |
![]() |
#3 |
Участник
|
Цитата:
Инвариант: Конструирование объекта полностью завершено после завершения конструктора new(). Или, другими словами, объект становится валидным (целостным) после завершения конструктора new(). Другие утверждения не всегда истинны. Если я правильно понимаю gl00mie, то он хочет сказать именно это. |
|
![]() |
#4 |
Боец
|
![]()
И хватает же у вас времени, господа, так активно дискутировать по такой незначительной теме... По-моему всем все давно понятно (ещё до этого поста). Играть словами можно до бесконечности и врядли это к чему-то полезному приведет. Может автор поста вообще закатил этот шар по-приколу...
![]() |
|