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

Class 从类继承或声明字段继承的选择,class,oop,inheritance,Class,Oop,Inheritance,假设我有一个类产品{string name;double price;…} 因此,如果我想实现季节性或折扣产品,我可以添加声明isPromoted/isSeasonal,或者我可以创建一个新的类promotedProduct:product{…},季节性product:product{}等等 有人告诉我,初学者倾向于滥用继承,以及它是多么邪恶。因此,我不确定我是否被认为在这种情况下滥用。或者它们都是错误的,使用界面更好等等。如果您想要您的第一个解决方案,产品是否只是在促销上-即-没有实际的促销细

假设我有一个类产品{string name;double price;…}

因此,如果我想实现季节性或折扣产品,我可以添加声明isPromoted/isSeasonal,或者我可以创建一个新的类promotedProduct:product{…},季节性product:product{}等等


有人告诉我,初学者倾向于滥用继承,以及它是多么邪恶。因此,我不确定我是否被认为在这种情况下滥用。或者它们都是错误的,使用界面更好等等。

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

希望这有帮助


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

一个好的经验法则是区分哪些更改了,哪些没有更改

您不能在运行时更改类型,但可能希望能够轻松地升级/降级产品

一种选择是将状态直接存储在产品上作为字段(但如果它们累积、isLowInStock等,这将变得很糟糕)

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

  • 使用封装状态(可以将特定行为与状态更改绑定在一起)
  • 将状态外部化并进行服务调用
  • 使用#1防止将来的更改(即更多字段)#2可能是杀伤力过大


    请不要使用double表示价格-请参阅或。

    季节性或折扣产品是否添加属性?他们有不同的行为吗?这就是继承的驱动力。我怀疑他们的行为没有真正的区别,他们所具有的属性也没有真正的区别

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

    所以我还有一个问题