我正在为我的Data Structures类创建一个简单的战争游戏。
我目前有一个方法如下:
Play Turn(List<Card> player1, List<Card> player2){
return null;
}
上面的方法(我理解目前是不完整的)假设接受List接口的任何子接口(即Stack,ArrayList,LinkedList等)。
Stack使用pop()返回/删除Stack的顶部,类似于ArrayList或LinkedList,我可以使用get()方法返回第一个元素,然后使用remove()方法删除该元素。
那么我是否可以通用方式执行此操作,或者是否必须创建为每个允许使用的List版本定制的方法?
答案 0 :(得分:1)
请学习并遵循Java编码标准(Google或Sun/Oracle)。没有它们,你的代码就不那么容易理解。
您的方法应如下所示:
Play turn(List<Card> player1, List<Card> player2) {
return null;
}
含义很明确:您可以在实现Object
接口的堆上传递对List
的任何引用。这意味着您的实现应该只调用List
接口中的方法。您不应该关注您所提供的参考文献的具体实施。
我不明白Stack
在此界面中的位置。 Stack
可以使用List
实现,但其方法(push,pop,peek)不是List
接口的一部分。他们将不受界面参数限制。
如果您认为每个玩家的方法都需要Stack<Turn>
,那么您不应该使用List
作为参数。
答案 1 :(得分:0)
任何实现List
接口的类都会对调用List
方法时发生的事情做出一系列承诺。他们可能以不同的方式履行承诺,但承诺将在所有实施中得到满足。
例如,对get(0)
的任何实现调用List
将返回列表中的第一项。无论您使用的是ArrayList
,LinkedList
,Stack
还是JoesCustomList
,都是如此。因此,无需为不同类型的列表定制方法。
答案 2 :(得分:0)
恰恰相反:除非你有充分的理由,否则你绝对想避免任何垂头丧气!因此,任何类型的实例检查和向下转换为List接口的具体实现都是您不希望在代码中使用的内容!
含义:这些接口的主要优点之一是它们已经包含了您需要调用的方法。
换句话说:此类接口的关键值之一是接口本身提供了完成工作所需的那些方法。它们提供了强大的抽象,允许您的代码完全不知道“该界面实际是如何实现的!”