![]() |
#13 |
Участник
|
Я правильно понимаю, что список контейнеров в данном случае - это способ организации хранения/передачи неоднородной структуры.
При работе с неоднородными структурами нужно помнить, что какой бы неоднородной не была бы структура данных вы же всё равно будете обрабатывать её по заранее определённым правилам. Так зачем же тогда создавать иллюзию универсальности если правила обработки фиксированы и предопределены. Я бы данную структуру данных преобразовал бы в список классов (List = new List(Types::Class)) поместил бы этот список в класс обёртку, который бы контролировал типы хранящихся в списке значений. Для представления элементов списка сделал бы иерархию классов: Базовый класс представляет общий интерфейс для формирования вкладки, а его наследники реализуют каждый конкретный способ организации вкладки. Для удобства использования можно добавить статические методы, создающие экземпляры необходимых классов. После всего этого привидённый вами код мог бы выглядеть например так X++: Lookup = new Lookup(); Lookup.addTab(Lookup::newdatasource(tablenum(InventTable), fieldnum(InventTable, ItemName)); Lookup.addTab(Lookup::newdatasourcequery(tablenum(InventTable), query.pack(), fieldnum(InventTable, ItemId)); Lookup.addTab(Lookup::newdatasourcetmp(tablenum(anytable), anytable, fieldnum(anytable, anyfield)); Lookup.parmCaller(this); Lookup.run(); X++: List param = new List(Types::Class); Struct Struct; Struct = new Struct(); Struct.add("type", "newdatasource"); Struct.add("tablenum", tablenum(InventTable)); Struct.add("fieldnum", fieldnum(InventTable, ItemName)); List.addEnd(Struct); Struct = new Struct(); Struct.add("type", "newdatasourcequery"); Struct.add("tablenum", tablenum(InventTable)); Struct.add("query", query); Struct.add("fieldnum", fieldnum(InventTable, ItemId)); List.addEnd(Struct); Struct = new Struct(); Struct.add("type", "newdatasourcetmp"); Struct.add("tablenum", tablenum(anytable)); Struct.add("cursor", anytable); Struct.add("fieldnum", fieldnum(anytable, anyfield)); List.addEnd(Struct); Lookup::run(param, this); |
|
|
|