2

次のクラス図を検討してください。

+--------+     * +------------+ 
| Person |------>|   Property |
+--------+       +------------+
                      ^
                      |
             +--------+------+
             |               |
      +----+----+     +------+-----+
      |   Car   |     |   House    |
      +---------+     +------------+

人には、車、家、スマートフォンなど、多くのプロパティがあります。これらのプロパティにはそれぞれ異なる属性があります(車には、エンジンサイズ、モデル、年...住所としての家、サイズなどがあります)。多くのサブクラス(プロパティのタイプ)があります。

現在、私の実装では、Propertyに型フィールドを持つ抽象クラスがあります。タイプを確認し、それによって適切なサブクラスにキャストします。

私の質問は:これが唯一の方法ですか?これはそれを行う正しい方法ですか?気分が悪いので、デザインの感想を教えてください。根本的な変更も受け入れられます。

4

1 に答える 1

5

それは、これらの をどのように使用したいかProperty、一般的または具体的 (またはその両方) に大きく依存します。それらが所有できるという事実だけが共通している場合は、共通の基本クラスではなく、それらの間に共通のインターフェイスを用意することをお勧めします。次に、それらをコレクションに格納し、コレクションのサブセットに対して機能する機能固有のメソッドを使用できます。これにより、最初に目的の機能に基づいてコレクションがフィルター処理されます。機能は、型やクラスというよりもインターフェイスやロールに似ています。そのため、達成したいこと (意図) とそれを達成する方法(実装)の間にある程度の独立性を持たせることができます。

疑似 C# コードでは、次のようになります。

interface Property {}
interface Valued {
  Money Value { get; }
}
class Person {
  private Collection<Property> properties;
  public Money TotalValue {
    get {
      return properties.OfType<Valued>().Sum(v => v.Value);
    }
  }
}

Car同じ手法を使用して、すべての で何かをしたい場合など、特定のタイプでフィルタリングすることもできます。より一般的なメソッドは、クライアントが特定のロジックを実行できるように、特定の型のすべてのプロパティを返すことができます。

于 2012-05-30T00:41:29.563 に答える