这是使用instanceof运算符的有效案例吗?

时间:2015-07-09 01:39:16

标签: java oop inheritance instanceof

我是Java和OOP的初学者,我对Java中的继承有疑问。

在我的项目中,我有一个班级Order,表示为资产下达的订单。我打算有几个扩展Order的课程,包括LimitBuyOrderLimitSellOrder&同样适用于市场订单。

我还会有一个班级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
    }
}

基本上,我的问题是如何正确确定子类的类型?提前谢谢!

1 个答案:

答案 0 :(得分:4)

您应该将行为封装在订单类型中,而不是简单地在外部使用其类型来切换行为。

为您的订单添加方法'完成工作的类,然后你根本不需要知道它的类型:

order.openPosition(...);

让'命令'根据其类型做任何需要做的事情。

封装的一个重要好处是,您最终会在一个地方拥有所有特定于订单类型的行为。抽象的父类自然而然地提供任何共同的订单特征。将代码放在一个地方(或至少在一个小的层次结构中),您可以更改行为,而无需访问整个应用程序的代码。