我是Java和OOP的初学者,我对Java中的继承有疑问。
在我的项目中,我有一个班级Order
,表示为资产下达的订单。我打算有几个扩展Order
的课程,包括LimitBuyOrder
和LimitSellOrder
&同样适用于市场订单。
我还会有一个班级Position
,它由一对订单组成。为了确定Position
的类型,我必须知道首先输入了哪种类型的Order
。虽然instanceof
运算符可以在这种情况下工作,但我觉得它不是一个合适的解决方案。下面是一个精简的片段,可能有助于说明我的问题:
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
并覆盖它们以根据扩展的子类true
返回Order
?
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
}
}
基本上,我的问题是如何正确确定子类的类型?提前谢谢!
答案 0 :(得分:4)
您应该将行为封装在订单类型中,而不是简单地在外部使用其类型来切换行为。
为您的订单添加方法'完成工作的类,然后你根本不需要知道它的类型:
order.openPosition(...);
让'命令'根据其类型做任何需要做的事情。
封装的一个重要好处是,您最终会在一个地方拥有所有特定于订单类型的行为。抽象的父类自然而然地提供任何共同的订单特征。将代码放在一个地方(或至少在一个小的层次结构中),您可以更改行为,而无需访问整个应用程序的代码。