这是使用 instanceof 运算符的有效案例吗?
Is this a valid case to use instanceof operator?
我是 Java 和 OOP 的初学者,我对 Java 中的继承有疑问。
在我的项目中,我有一个 class Order
代表为资产下的订单。我打算有几个扩展 Order
的 classes,包括 LimitBuyOrder
和 LimitSellOrder
& 同样适用于市场订单。
我也会有一个classPosition
,它由一对订单组成。为了确定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()
等,return false
并将它们覆盖到 return true
是基于哪个subclass 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
}
}
基本上,我的问题是如何正确确定 subclass 的类型?提前致谢!
您的目标应该是将 行为 封装在订单类型中,而不是简单地在外部使用它们的类型来切换行为。
向您的 'Order' class 添加一个方法来完成工作,然后您根本不必知道它是什么类型:
order.openPosition(...);
让'Order'根据其类型做任何它需要做的事情。
封装的一个显着好处是您最终将所有特定于订单类型的行为集中在一个地方。抽象父 classes 自然而然地提供了任何常见的订单特征。将代码放在一个地方(或至少在 classes 的小层次结构中),您可以更改行为,而无需访问整个应用程序的代码。
我是 Java 和 OOP 的初学者,我对 Java 中的继承有疑问。
在我的项目中,我有一个 class Order
代表为资产下的订单。我打算有几个扩展 Order
的 classes,包括 LimitBuyOrder
和 LimitSellOrder
& 同样适用于市场订单。
我也会有一个classPosition
,它由一对订单组成。为了确定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()
等,return false
并将它们覆盖到 return true
是基于哪个subclass 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
}
}
基本上,我的问题是如何正确确定 subclass 的类型?提前致谢!
您的目标应该是将 行为 封装在订单类型中,而不是简单地在外部使用它们的类型来切换行为。
向您的 'Order' class 添加一个方法来完成工作,然后您根本不必知道它是什么类型:
order.openPosition(...);
让'Order'根据其类型做任何它需要做的事情。
封装的一个显着好处是您最终将所有特定于订单类型的行为集中在一个地方。抽象父 classes 自然而然地提供了任何常见的订单特征。将代码放在一个地方(或至少在 classes 的小层次结构中),您可以更改行为,而无需访问整个应用程序的代码。