从类或声明字段中继承的选择

时间:2013-08-23 23:49:36

标签: class oop inheritance

假设我有一个产品类{字符串名称;双倍价格; ...}

因此,如果我想实施季节性或折扣产品,我可以添加声明isPromoted / isSeasonal或者我可以创建一个新类promoteProduct:Product {...},seasonalProduct:Product {}等等。 / p>

我被告知初学者倾向于滥用继承以及它是如何邪恶的。所以我不确定在这种情况下我是否被认为是滥用。或者他们都错了,使用界面更好等。

3 个答案:

答案 0 :(得分:1)

产品是否只是促销 - 即 - 没有实际的促销细节(不同的价格,日期等) - 如果你想要你的第一个解决方案。否则,您需要与Promotions类建立关系,以便存储此类详细信息。

希望这有帮助。

注意:这是一个从未使用过Java的通用编程答案。

答案 1 :(得分:1)

一个好的经验法则是将哪些变化与不变化分开。

您无法在运行时更改类型,但您可能希望能够轻松地推广/降级产品。

一种选择是将状态直接存储在Product作为字段(但如果它们累积,则会变得很难看,isLowInStock等)。

可能更好的操作系统将产品视为一个实体,并通过以下方式将isPromoted / isSeasonal状态分开:

  1. 使用State pattern封装状态(您可以使用Strategy将特定行为与状态更改联系起来)
  2. 将状态外部化并进行服务调用
  3. 使用#1防范未来的变化(即更多字段)。 #2可能有点矫枉过正。

    请勿使用双倍代表价格 - 请参阅this questiongoogle

答案 2 :(得分:0)

季节性或折扣产品是否会添加属性?他们有不同的行为吗?这就是推动继承的原因。我怀疑行为没有真正的区别,他们携带的属性也没有真正的区别。

因此,我将折扣视为每种产品都具有的属性:任何产品都可以进行销售并获得折扣,因此我会有一个属性,指示当前的折扣百分比或金额(可能默认为零,或者它可以为空。同样适用于季节性:应该只是一个布尔标志吗?