Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 设计问题:拥有一个包含许多不同子类的类_Design Patterns_Class Design_Class Diagram - Fatal编程技术网

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

Design patterns 设计问题:拥有一个包含许多不同子类的类,design-patterns,class-design,class-diagram,Design Patterns,Class Design,Class Diagram,考虑以下类图: +--------+ * +------------+ | Person |------>| Property | +--------+ +------------+ ^ | +--------+------+ | | +----+----+ +------+--

考虑以下类图:

+--------+     * +------------+ 
| Person |------>|   Property |
+--------+       +------------+
                      ^
                      |
             +--------+------+
             |               |
      +----+----+     +------+-----+
      |   Car   |     |   House    |
      +---------+     +------------+
人有许多财产,包括汽车、房子、智能手机等。每个财产都有不同的属性(汽车有发动机大小、型号、年份……房子作为地址、大小等)。 有许多子类(属性类型)

现在,我的实现有一个带有类型字段的抽象类。我检查类型并通过它将其转换为正确的子类

我的问题是:这是唯一的办法吗?这样做对吗?
感觉不太对,请和我分享你的设计想法。也可以接受根本性的更改。

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

在伪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);
    }
  }
}
接口属性{}
界面值{
货币价值{get;}
}
班主任{
私人收藏财产;
公共货币总价值{
得到{
返回properties.OfType().Sum(v=>v.Value);
}
}
}

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

+1很好,您可以指出,设计取决于用法,而不是类内容。