design-patterns - 设计问题: Owning a class with many different subclasses

标签 design-patterns class-design class-diagram

考虑以下类图:

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

人拥有许多属性,包括汽车、房屋、智能手机等。每个属性都有不同的属性(汽车有发动机尺寸、型号、年份……房屋作为地址、大小等)。 有许多子类(属性类型)。

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

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

最佳答案

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

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

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

关于design-patterns - 设计问题: Owning a class with many different subclasses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10808519/

相关文章:

UML多对象类: Use singular or plural?

java - 依赖注入(inject)可以被认为是工厂方法模式的替代品吗?

c++ - 具有静态 unique_ptr 的单例是一个好习惯吗

uml - 类图 UML

C++ 数据分组类和常量访问

uml - 如果我在模型中有确切数量的东西,我应该使用 n 还是 *?

javascript - 从私有(private)函数访问类成员

javascript - 编写处理另一个函数输出的PHP函数时要使用哪种设计模式?

c++ - 如何在不传递大量参数的情况下处理类的 "many small functions"的想法?

uml - 如何在 Visual Studio 2013 中导出类图/UML?