Java ArrayLists:将父类和子类添加到同一个arraylist解决方案中

时间:2017-02-11 04:50:32

标签: java arraylist subclass

我目前正致力于一个写国际象棋游戏的独立项目。我目前面临的问题是我有一个方法返回一个类型为Move(自解释)的arraylist,它在确定所有合法移动时被调用。虽然这很好用,但我引入了一个名为Castle的类,它扩展了Move(我这样做是因为与正常移动不同,castling会影响4个方格,而不仅仅是2个方格)。

我希望方法getMoves()能够自包含,或者能够返回所有有效的移动,包括Move类型的对象及其子Castle。

问题是如果我包含一个声明,它将有效的转换移动添加到方法getMoves(它返回一个类型为move的数组列表)我可以a。)添加arraylist作为类型移动,其中信息丢失,或b。)一个类型的城堡,它将返回的arraylist改变为所有城堡的类型,显然打破了方法。

有没有优雅的方法来实现这一目标?我正在寻找解决这个问题的方法,而无需重新编写move类,同时保持getMoves方法的独立性。

3 个答案:

答案 0 :(得分:1)

您可以使用移动对象的arraylist并使用instanceof运算符检查城堡对象。然后将对象加速为城堡类型。

if( moveobject instanceof Castle){
Castle castleobject = (Castle) moveobject;

//无论你想做什么,你都可以使用castleobject

}

答案 1 :(得分:0)

另一种选择是你可以在这里使用通用。在您的情况下,您希望返回Move或Castle的列表,或者以全局方式返回Move或其子类型的列表。以下是示例代码:

public <T extends Move> List<T> getMoves();

通过这种方式,如果您需要添加另一个子类型Move而不是Castle,则无需再修改返回类型。

答案 2 :(得分:0)

如果不了解所有内容的使用情况,很难做出好的设计决定,但这里有几个你可以考虑的解决方案:

  1. 创建MoveBasicMove的{​​{1}}超类,然后让您的方法返回该Castling超类的列表。在这种情况下,您当前的Move课程应重命名为Move

  2. BasicMove课程中添加Castling作为字段。你可以在Move课程中保存该车的移动,并且国王在新的Move字段内移动。