Здравствуйте уважаемые коллеги!
Возникла задача сделать механизм выгрузки кучи различных выборок в локальные файлы. Способ получения данных для выборок один и то же. Отличаются они только структурой и преобразованием данных которые потом будут выгружаться. Решил применить ООП. То есть имеем базовый класс который реализует выборку данных а так же сохранение данных в файл, и есть классы наследники которые отличаются только реализацией метода преобразования данных из полученной выборки и структурой выходной таблицы для выгрузки. Для наглядности я сделал пример, который размещен ниже. Здесь есть базовый класс cl_template и два наследника cl_select1 и cl_select2.
Проблема в методе выгрузки в файл. Т.к. структура таблицы out_tab неизвестна в базовом классе я написал метод save_data_to_file который сохраняет в файл любую стандартную таблицу. А наследники имеют метод save_to_file который вызывает этот метод передавая в качестве параметра их персональные таблиц out_tab. Этот метод приходиться дублировать во всех наследниках, что неудобно

А хорошо было бы определить out_tab сразу в базовом классе но как-то так неявно что ли? А ее структуру уточнять в наследника. Тогда не нужен был бы метод save_to_file в каждом наследнике - достаточно было бы метод базового класса save_data_to_file чтобы все выгрузилось. Или может быть есть альтернативный вариант решения?
Надеюсь я понятно изложил мысль. Заранее благодарен. Прошу прощения за длинное повествование

Вот код пример:
Code:
*&---------------------------------------------------------------------*
*& Report ZCLASS_TEST *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
REPORT zclass_test.
*----------------------------------------------------------------------*
* CLASS cl_template DEFINITION
*----------------------------------------------------------------------*
* базовый класс который умеет выбирать данные в общем виде
* и сохранять их в файл
*----------------------------------------------------------------------*
CLASS cl_template DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS:
add_data IMPORTING connid TYPE s_conn_id,
transfer_data ABSTRACT.
PROTECTED SECTION.
METHODS:
save_data_to_file IMPORTING out_tab TYPE STANDARD TABLE.
DATA:
s_spfli TYPE spfli,
file_name TYPE string.
ENDCLASS. "cl_template DEFINITION
*----------------------------------------------------------------------*
* CLASS cl_template IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_template IMPLEMENTATION.
METHOD save_data_to_file.
DATA:
path TYPE string.
CONCATENATE 'D:\temp\' file_name '.txt' INTO path.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = path
filetype = 'ASC'
write_field_separator = 'X'
trunc_trailing_blanks = 'X'
write_lf = 'X'
codepage = '1504'
TABLES
data_tab = out_tab.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDMETHOD. "save_data_to_file
METHOD add_data.
SELECT * FROM spfli INTO CORRESPONDING FIELDS OF s_spfli WHERE connid = connid.
CALL METHOD transfer_data.
ENDSELECT.
ENDMETHOD. "add_data
ENDCLASS. "cl_template IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS cl_select1 DEFINITION
*----------------------------------------------------------------------*
* класс который преобразует данные по способу № 1
*----------------------------------------------------------------------*
CLASS cl_select1 DEFINITION INHERITING FROM cl_template.
PUBLIC SECTION.
METHODS:
constructor,
transfer_data REDEFINITION,
save_to_file.
PROTECTED SECTION.
TYPES:
BEGIN OF out_tab_t,
airpfrom TYPE spfli-airpfrom,
count TYPE i,
END OF out_tab_t.
DATA:
out_tab TYPE TABLE OF out_tab_t INITIAL SIZE 0,
out_tab_wa LIKE LINE OF out_tab.
ENDCLASS. "cl_select1 DEFINITION
*----------------------------------------------------------------------*
* CLASS cl_select1 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_select1 IMPLEMENTATION.
METHOD constructor.
file_name = 'select1'.
ENDMETHOD. "constactor
METHOD transfer_data.
MOVE-CORRESPONDING s_spfli TO out_tab_wa.
out_tab_wa-count = 1.
COLLECT out_tab_wa INTO out_tab.
ENDMETHOD. "transfer_data
METHOD save_to_file.
CALL METHOD save_data_to_file
EXPORTING
out_tab = out_tab.
ENDMETHOD. "save_to_file
ENDCLASS. "cl_select1 IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS cl_select1 DEFINITION
*----------------------------------------------------------------------*
* класс который преобразует данные по способу № 2
*----------------------------------------------------------------------*
CLASS cl_select2 DEFINITION INHERITING FROM cl_template.
PUBLIC SECTION.
METHODS:
constructor,
transfer_data REDEFINITION,
save_to_file.
PROTECTED SECTION.
TYPES:
BEGIN OF out_tab_t,
airpfrom TYPE spfli-airpfrom,
airpto TYPE spfli-airpto,
count TYPE i,
END OF out_tab_t.
DATA:
out_tab TYPE TABLE OF out_tab_t INITIAL SIZE 0,
out_tab_wa LIKE LINE OF out_tab.
ENDCLASS. "cl_select1 DEFINITION
*----------------------------------------------------------------------*
* CLASS cl_select1 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_select2 IMPLEMENTATION.
METHOD constructor.
file_name = 'select2'.
ENDMETHOD. "constactor
METHOD transfer_data.
MOVE-CORRESPONDING s_spfli TO out_tab_wa.
out_tab_wa-count = 1.
APPEND out_tab_wa TO out_tab.
ENDMETHOD. "transfer_data
METHOD save_to_file.
CALL METHOD save_data_to_file
EXPORTING
out_tab = out_tab.
ENDMETHOD. "save_to_file
ENDCLASS. "cl_select1 IMPLEMENTATION
DATA:
select1 TYPE REF TO cl_select1,
select2 TYPE REF TO cl_select2.
INITIALIZATION.
CREATE OBJECT select1.
CALL METHOD select1->add_data
EXPORTING
connid = 1984.
CALL METHOD select1->save_to_file.
CREATE OBJECT select2.
CALL METHOD select2->add_data
EXPORTING
connid = 1984.
CALL METHOD select2->save_to_file.