假设我有一个超类Order
和两个子类VehicleOrder
和TaskOrder
。两者都从超类继承了很多方法,但是有一个特定的字段:VehicleOrder
有一个Model
而TaskOrder
有一个任务。
现在,在另一个班级中,我有一个Order
的列表。在该方法中,我需要根据订单的特定字段进行计算。
我现在的解决方案是使用两个方法Order
和getModel()
“污染”超类getTask()
,默认情况下返回null并且可以被子类覆盖。然后另一个类检查null,如果不为null,则进行计算。虽然这不是正确的方法...
由于我不知道其他类中一般订单列表的子类类型,我无法转换为获取该属性。
解决此问题的唯一方法是使用Visitor pattern
,但这感觉有点矫枉过正..是吗?
有干净的方法吗?
答案 0 :(得分:1)
为什么不在基类上添加抽象方法doCalculation
,然后在子类中重写它。当您遍历订单列表时,只需调用doCalculation
方法并相应处理。
答案 1 :(得分:1)
提取一个公共基类(或接口),Task和Model都可以实现。让Order引用该类型,而不是按每个订单类型引用具体类型。
这可能说起来容易做起,这取决于任务和模型的相似/不同。它可能需要重构和抽象更多东西才能工作。
如果证明变更/工作太多,请回到访客模式。