質問

minOccursとmaxOccursを0、1、または無制限に頻繁に設定してXMLを処理しています。特定のデータ型とともに、このカーディナリティを記述するスキーマがあります。 minOccursフィールドとmaxOccurフィールドに基づいてディメンションを検証する配列とともに、カーディナリティを追跡する(Delphi)クラスを構築したいと思います。 (XMLスキーマルールに基づいて)読み込む前にデータ型を完全に認識しているため、バリアントを使用するのは設計上の選択肢としては不十分だと思います。

私はOOP全般、特にDelphi OOPを初めて使用するので、ここでの最良の選択肢は何ですか?私は次のようなものを考えました:

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