Перегрузка вставки массива? - PullRequest
0 голосов
/ 26 октября 2009

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

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

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;

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

1 Ответ

2 голосов
/ 26 октября 2009

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

...