Pregunta

Estoy procesando un XML con minOccurs y maxOccurs establecidos con frecuencia en 0, 1 o ilimitado. Tengo un esquema que describe esta cardinalidad, junto con el tipo de datos específico. Me gustaría construir una clase (Delphi) que realice un seguimiento de la cardinalidad, junto con una matriz cuyas dimensiones se validarán según los campos minOccurs y maxOccur. Creo que el uso de variantes es una mala elección de diseño, ya que conoceré el tipo de datos antes de leerlos (según las reglas del esquema XML).

Soy bastante nuevo en OOP en general, y en Delphi OOP en particular, ¿cuáles son mis mejores opciones aquí? He soñado algo como:

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;

Por supuesto, FValue puede terminar siendo una cadena, un entero, un doble, etc. Por lo tanto, creo que necesito especializarme:

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

Ahora, ¿es el camino correcto? ¿Tengo que sobrecargar AddValue (Value: SomeType) en todas las clases diferentes (cada clase correspondiente a un tipo de datos)? Eso no parece muy hábil, ya que haré casi lo mismo en cada método AddValue:

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

Realmente odiaría hacer esto para cada tipo. (Es cierto que no habrá muchos tipos, pero aún lo considero un diseño defectuoso, ya que el contenido lógico es bastante idéntico en los métodos sobrecargados). ¿Algún buen consejo por ahí? ¡Gracias!

¿Fue útil?

Solución

No ha especificado su versión de Delphi, pero este es un ejemplo clásico de genéricos (disponible en D2009 y superior).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top