Перегрузка вставки массива?
-
06-07-2019 - |
Вопрос
Я обрабатываю 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 и более поздних версиях).