设计问题:拥有一个包含许多不同子类的类

时间:2012-05-30 00:23:52

标签: design-patterns class-design class-diagram

考虑以下类图:

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

人有许多属性,包括汽车,房子,智能手机等。每个属性都有不同的属性(汽车有引擎大小,型号,年份......房子作为地址,大小等)。 有许多子类(属性类型)。

现在我的实现是将Property作为带有类型字段的抽象类。我检查类型并将其转换为正确的子类。

我的问题是:这是唯一的方法吗?这是正确的方法吗? 它没有那么正确,所以请与我分享你的设计思路。也将接受彻底改变。

1 个答案:

答案 0 :(得分: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执行某些操作。更通用的方法可以返回特定类型的所有属性,以便客户端可以使用它们执行某些特定逻辑。