【发布时间】:2015-07-09 01:39:15
【问题描述】:
我是 Java 和 OOP 的初学者,我有一个关于 Java 继承的问题。
在我的项目中,我有一个类Order,它表示为资产下达的订单。我打算有几个扩展Order 的类,包括LimitBuyOrder 和LimitSellOrder 以及类似的市场订单。
我还将有一个类Position,它由一对订单组成。为了确定Position的类型,我必须知道首先输入了Order的类型。尽管instanceof 运算符可以在这种情况下工作,但我觉得这不是一个合适的解决方案。下面是一个精简的 sn-p,它可能有助于说明我的问题:
class Position {
//Other fields and methods omitted for clarity
public void open(Order o) {
if(o instanceof LimitBuyOrder)
//Set position type to LONG
if(o instanceof LimitSellOrder)
//Set position type to SHORT
}
}
或者我应该在Order 中定义方法,例如isLimitBuy() & 等,这些方法返回false 并根据Order 扩展的子类覆盖它们以返回true?
class Position {
//Other fields and methods omitted for clarity
public void open(Order o) {
if(o.isLimitBuyOrder())
//Set position type to LONG
if(o.isLimitSellOrder())
//Set position type to SHORT
}
}
基本上,我的问题是如何正确确定子类的类型?提前致谢!
【问题讨论】:
-
您的建议可行,但如果仅用于
open方法,那么您所拥有的也可以。 -
为什么不将行为委托给
Order接口呢?我会尝试限制instanceof(s) 的数量,如果您必须确定某些内容是否可分配,您可以使用Class.isAssignableFrom(Class) -
以上述方式使用
instanceof本身并没有错,但通常“O-O设计”会导致人们想要拥有Order的属性提供等效信息。 IOW,如果这是您需要区分的唯一地方,那么instanceof可能是个好主意,但如果在其他情况下您需要特定类型的信息或操作,那么您应该考虑利用 O-O 的力量。 -
这些方法本身并没有错误,但它们不是面向对象的。如果使用
instanceof方法,则每次添加新的Order类型时都必须添加新的if子句。如果你用第二种方法,你必须这样做 plus 为每个现有的Order类型添加一个新的isXyzOrder()方法。 Derek Hulley 的回答显示了多态、OO 方式。如果您以 OO 方式进行操作,添加新的Order类型不会影响其他任何内容。
标签: java oop inheritance instanceof