作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑下面的类图:
+--------+ * +------------+
| Person |------>| Property |
+--------+ +------------+
^
|
+--------+------+
| |
+----+----+ +------+-----+
| Car | | House |
+---------+ +------------+
Person 有许多属性,包括 Car、House、Smartphone 等。这些属性中的每一个都有不同的属性(Car 有引擎大小、型号、年份……House 作为地址、大小等)。有许多子类(属性类型)。
现在我的实现是让 Property 成为一个带有类型字段的抽象类。我检查类型并将其转换为正确的子类。
我的问题是:这是唯一的方法吗?这是正确的方法吗?感觉不太对,请与我分享您的设计想法。彻底的改变也会被接受。
最佳答案
这实际上取决于您希望如何使用这些 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);
}
}
}
您还可以使用相同的技术按特定类型进行过滤,例如,如果您想对所有 Car
执行某些操作。更通用的方法可以返回特定类型的所有属性,以便客户端可以使用它们执行某些特定逻辑。
关于design-patterns - 设计问题 : Owning a class with many different subclasses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10808519/
我是一名优秀的程序员,十分优秀!