2

考虑下面的类图:

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

Person 有许多属性,包括 Car、House、Smartphone 等。这些属性中的每一个都有不同的属性(Car 有一个引擎大小、型号、年份……House 作为地址、大小等)。有许多子类(属性类型)。

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

我的问题是:这是唯一的方法吗?这是正确的方法吗?感觉不太对劲,所以请与我分享您的设计想法。一个根本性的改变也将被接受。

4

1 回答 1

5

这实际上取决于您希望如何使用这些Propertys,一般或具体(或两者)。如果它们唯一的共同点是可以拥有它们,我希望它们之间有一个公共接口,而不是一个公共基类。然后,您可以将它们存储在一个集合中,并具有作用于集合子集的特定于能力的方法,这些方法将首先根据所需的能力过滤集合。能力更像是接口和角色,而不是类型和类;因此,您可以在想要实现的目标(您的意图)和实现目标的方式(您的实施)之间拥有一定程度的独立性。

在伪 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您还可以使用相同的技术按特定类型进行过滤,例如,如果您想对所有 s做某事。更通用的方法可以返回特定类型的所有属性,以便客户端可以使用它们执行某些特定逻辑。

于 2012-05-30T00:41:29.563 回答