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

wol*_*ats 2 design-patterns class-design class-diagram

考虑以下类图:

+--------+     * +------------+ 
| Person |------>|   Property |
+--------+       +------------+
                      ^
                      |
             +--------+------+
             |               |
      +----+----+     +------+-----+
      |   Car   |     |   House    |
      +---------+     +------------+
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题是:这是唯一的方法吗?这是正确的方法吗?它感觉不对,所以请与我分享你的设计思路.也将接受彻底改变.

Jor*_*dão 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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您还可以Car使用相同的技术按特定类型进行过滤,例如,如果您想对所有s 执行某些操作.更通用的方法可以返回特定类型的所有属性,以便客户端可以使用它们执行某些特定逻辑.