Pergunta

Estou processando um XML com minOccurs e maxOccurs definido frequentemente como 0, 1, ou ilimitado. Eu tenho um esquema que descreve este cardinalidade, juntamente com o tipo de dados específico. Gostaria de construir uma classe (Delphi) que mantém um registo do cardinalidade, em conjunto com uma matriz cujas dimensões são para ser validado com base nos campos minOccurs e maxOccur. Eu acredito usando variantes é uma escolha de design pobre, como eu vou estar plenamente consciente do tipo de dados antes de ser lido (com base nas regras do esquema XML).

Eu sou um pouco novo para OOP em geral, e Delphi OOP em particular, então o que é meus melhores opções aqui? Eu sonhei-se 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;

Claro, valor F pode acabar sendo uma string, um inteiro, um duplo, etc. Assim, eu acredito que eu preciso para se especializar:

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

Agora, é o caminho certo a seguir? Eu tenho que sobrecarregue AddValue (Valor: SomeType) em todas as diferentes classes (cada classe corresponde a um tipo de dados)? Isso não parece muito liso, como eu vou estar fazendo praticamente a mesma coisa em cada AddValue-método:

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

Eu realmente odeio fazer isso para cada tipo. (Na verdade, não haverá que muitos tipos, mas eu ainda considerá-lo projeto falho, como o conteúdo lógico é praticamente idêntica nos métodos sobrecarregados.) Qualquer boas dicas lá fora? Obrigado!

Foi útil?

Solução

Você não especificou a sua versão do Delphi, mas este é um exemplo clássico dos genéricos (disponíveis em D2009 e superior).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top