2009-03-17 18 views
2

ここで私は適切なデザインを見つけようとしています。OOGenericsのデザインに関する考慮事項

数字のプロファイルを保存する必要があります。プロファイルは単なる一連の数字です。 int型、float型、decimal型のいずれかになります。各プロファイルには、ennumerationに基づくProfileDescriptionフィールドがあります。

各プロファイルには、ProfileVersionオブジェクトのコレクションがあります。各ProfileVersionオブジェクトには、ProfileValueオブジェクトのコレクションがあります。これらのProfileValueオブジェクトは、必要なタイプの実際の数値が格納される場所です。

私の最初のデザインアイデアは、Profile、ProfileVersionおよびProfileValueを一般的にすることでした。私は、私が持っていないさまざまなタイプのプロフィールのリストを持っていたいときに問題に遭遇しました。代わりにArrayListを使用することができますが、その中のデータをキャストする必要があります。

私は、ProfileVersionとProfileValueを汎用的にして、ProfileDescriptionフィールドの値に応じてProfileVersionにタイプを割り当てることができますが、これを行う方法が見つかりません。

私はProfileBaseクラスを使用し、GenericProfileClassまたはIntProfile、FloatProfile、DecimalProfileのいずれかを使用してサブクラス化する必要がありましたが、これはそれぞれのクラスを汎用的にすることよりも利点がありません。とにかく毎回サブクラスをキャストしてください。

このような状況に最適な設計アプローチについてお考えいただきありがとうございます。

おかげ

答えて

2

グレシニオの考えは正しいです。したがって、あなたが持っているだろう唯一の制約は、インターフェースではなく、特定のタイプまたはキャストベースで

class ProfileList : IList<T> where T: IProfile 

:あなたのプロフィールの各クラスは、IProfileオブジェクトの実装にすることができ、その後、あなたのコンテナは以下のようになりクラス。

について:

もう一つの考えは、私が ProfileBaseクラスを使用して、GenericProfileClassまたは IntProfile、FloatProfileと DecimalProfileのいずれかで それをサブクラス化する必要がありましたが、これは本当に私を与えない でしょうとにかくサブクラス をキャストアウトしなければならないので、 を超えるあらゆる利点は、各クラスが一般的であるためです。

利点は、実際にはクラスの抽象度に依存します。適切に設計されていれば、理想的には、特定のキャストを知らなくても、それらの基本タイプのいずれかを受け入れることができるオペレーション/ビジネスロジック/マネージャークラスを持つことができます。

1

私は(役立つだろう動作しないコードを貼り付け)正しく問題を理解してかどうかわからないが、私はあなたがなどのインターフェイスIProfileIProfileVersionを作成しようと作ることができると思いますジェネリッククラスはインターフェイスProfile<T>:IProfileを継承します。

悲しいことに、基本的な数値型が存在しないため、とにかくやってみようとしていること。

関連する問題