Вопрос

Я обрабатываю XML с minOccurs и maxOccurs, которые часто устанавливаются в 0, 1 или неограниченно. У меня есть схема, описывающая эту мощность, вместе с конкретным типом данных. Я хотел бы создать класс (Delphi), который отслеживает количество элементов, вместе с массивом, размеры которого должны проверяться на основе полей minOccurs и maxOccur. Я считаю, что использование вариантов - плохой выбор дизайна, так как я буду полностью осведомлен о типе данных до того, как они будут прочитаны (основываясь на правилах схемы XML).

Я довольно новичок в ООП в целом и в Delphi ООП в частности, так какие у меня лучшие варианты здесь? Я придумал что-то вроде:

TComplexType = class(TObject)
  FMinOccurs: integer;
  FMaxOccurs: integer;
  FValue:     Array of Variant;
public
  constructor Create(Min: integer; Max: integer);
  procedure AddValue(Value: variant);
  function Validate() : boolean;
end;

Конечно, FValue может оказаться строкой, целым числом, двойным числом и т. д. Таким образом, я считаю, что мне нужно специализироваться:

TComplexString = class(TComplexType)
  FValue:     Array of string;
end;

Теперь правильный путь? Нужно ли перегрузить AddValue (Value: SomeType) во всех разных классах (каждый класс соответствует типу данных)? Это не выглядит очень гладко, так как я буду делать примерно то же самое в каждом методе AddValue:

procedure AddValue(Value: SomeType);
begin;
  // 1) Re-shape array
  // 2) Add Value as the last (newly created) element in the array
end;

Я бы очень не хотел делать это для каждого типа. (Следует признать, что типов будет не так много, но я все же считаю это некорректным дизайном, поскольку логический контент в перегруженных методах практически идентичен.) Есть ли полезные советы? Спасибо!

Это было полезно?

Решение

Вы не указали свою версию Delphi, но это классический пример для обобщений (доступно в D2009 и более поздних версиях).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top