我目前正致力于一个写国际象棋游戏的独立项目。我目前面临的问题是我有一个方法返回一个类型为Move(自解释)的arraylist,它在确定所有合法移动时被调用。虽然这很好用,但我引入了一个名为Castle的类,它扩展了Move(我这样做是因为与正常移动不同,castling会影响4个方格,而不仅仅是2个方格)。
我希望方法getMoves()能够自包含,或者能够返回所有有效的移动,包括Move类型的对象及其子Castle。
问题是如果我包含一个声明,它将有效的转换移动添加到方法getMoves(它返回一个类型为move的数组列表)我可以a。)添加arraylist作为类型移动,其中信息丢失,或b。)一个类型的城堡,它将返回的arraylist改变为所有城堡的类型,显然打破了方法。
有没有优雅的方法来实现这一目标?我正在寻找解决这个问题的方法,而无需重新编写move类,同时保持getMoves方法的独立性。
答案 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)
如果不了解所有内容的使用情况,很难做出好的设计决定,但这里有几个你可以考虑的解决方案:
创建Move
和BasicMove
的{{1}}超类,然后让您的方法返回该Castling
超类的列表。在这种情况下,您当前的Move
课程应重命名为Move
。
在BasicMove
课程中添加Castling
作为字段。你可以在Move
课程中保存该车的移动,并且国王在新的Move
字段内移动。