【问题标题】:Design Issue: Owning a class with many different subclasses设计问题:拥有一个具有许多不同子类的类
【发布时间】:2012-05-30 00:23:51
【问题描述】:

考虑下面的类图:

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

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

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

我的问题是:这是唯一的方法吗?这是正确的方法吗? 感觉不太对,所以请与我分享您的设计想法。也可以接受彻底的改变。

【问题讨论】:

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


    【解决方案1】:

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

    在伪 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);
        }
      }
    }
    

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

    【讨论】:

    • +1 很好,您指出设计取决于使用情况而不是课程内容。
    猜你喜欢
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多