Причём здесь вообще селекты? Нет, я понимаю, что селекты - это важная вещь, а их оптимизация даёт значительный эффект. Если бы у меня была конкретная задача и я спрашивал как мне оптимизировать её выполнение, то безусловно были бы уместны и советы насчёт селектов и насчёт "REUSE...".
Но у меня чисто теоретический вопрос именно про работу с классами. И я даже соглашусь, что это менее важный вопрос, чем селекты, но тем не менее он есть. Те, кто просто переписывает куски кода из примеров, не пытаясь вникнуть почему там так написано, свою позицию обозначили уже достаточно. Я её принял к сведению, спасибо. Прошу помощи у тех, кто вникал в этот вопрос.
Я конечно тоже свою программу "списывал" с АБАПовских примеров из SLIS. Если бы мне было всё понятно из этих примеров, я бы тут ничего не спрашивал.
Давайте возмём один из самых коротких примеров - BCALV_GRID_DEMO (версия 700). Там нет экрана выбора, но зато есть примечательный кусочек
Code:
FORM EXIT_PROGRAM.
* CALL METHOD G_CUSTOM_CONTAINER->FREE.
* CALL METHOD CL_GUI_CFW=>FLUSH.
LEAVE PROGRAM.
ENDFORM.
В данном случае понятно, что "снявши голову по волосам не плачут", поэтому можно очистные конструкции закомментировать. Но зачем их тут оставили? Я предполагаю, чтобы продемонстрировать, что вообще говоря, если бы не LEAVE PROGRAM, то их следовало бы вызвать. При этом для объекта GRID1 такой конструкции нет. Что может означать, что грид освобождать в любом случае не нужно, хотя класс CL_GUI_ALV_GRID имеет деструктор FREE. Кусочек кода метода FREE у класса контейнера подтверждает это:
Code:
LOOP AT CHILDREN INTO L_CHILD.
CALL METHOD L_CHILD->FREE
exceptions others = 1.
ENDLOOP.
Видно, что грид будет автоматически освобождён при освобождении контейнера, ибо при создании указывается, что он помещается внутрь контейнера.
Parazit указывал, что с освобождением грида и контейнера у него были сложности. Я таких сложностей не наблюдал. Если освобождать грид до освобождения контейнера, то всё работает нормально. А если после, то система ругается, что объекта не существует. Что подтверждает освобождние вложеных объектов при освобождении контейнера.
В примере BCALV_GRID_EDIT описывается (создаётся) класс lcl_event_receiver. Внутри PBO создаётся экземпляр этого класса. При этом он создаётся один раз вместе с созданием контейнера. В данном примере тоже нет экрана выбора, поэтому при выходе можно ничего не очищать. Но тут уже написано не так тщательно. Очистных конструкций нет даже в комментариях. Ну что поделать, пример недостаточно тщательно написан, цель его - показвть другие вещи. Но в итоге остаётся вопрос. Что же делать с такими объектами, как этот event_receiver, если их нужно освобождать?