实验三 接口
[实验目的]
1、
以Comparable为例,学习接口的使用,了解接口的优势。
2、
学习在Comparable接口的基础上进行排序。
3、
学习和使用自定义接口。
4、
和抽象类进行比较,并且在复杂的情况下选择抽象类或接口作为实现方式。
[实验内容]
1、
(必作)定义成绩类封装成绩数据。根据总分实现
Comparable
接口(规范见所附代码)。采用
Collections.sort
方法对其进行排序。构造测试程序测试。
2、
(必作)定义汇率表为一维数组,为一美元兑换各国货币的币值。定义货币类,保持一静态变量对汇率表的引用。派生出具体的货币类,如,人民币,英镑等。通过查表对美元的转换。实现其相互比较,即实现
Comparable
接口(规范见所附代码)。
3、
(选作,只需要思考)考虑中国象棋,每种棋子可有不同走法,如
”
相
”
走
”
田
”
字,
”
马
”
走
”
日
”
。若采用数组来表示棋子。其内封装变量
x,y
表示在棋盘上的位置。以“相”为例,其规则定义为。行列坐标连续两次同时加
1
(或同减,或
x
加
y
减,或
x
减
y
加连续执行两次)。再如以“马”为例,其规则为:先朝某方向走一步,如
x
加
1
,然后走对角线,此时又有两个方向可选择。
x,y
同加
1
或
x
加
1
,
y
减
1
。因此总体上最多有
8
个方向可以选择。“车”则可朝横向或纵向走一步或多步。所经过的路径上无其它棋子。而“炮”则同样可移动多步,但要求路径上有且只有一个其它棋子。
综合起来,所有棋子的走步规则均为纵向、横向、对角线的走向组合。另外还要考虑一次走一步或多步、棋盘的区域(如兵、士)限制、路径上是否有无其它棋子阻隔(如
”
炮
”
需要且只需要一个棋子阻隔)等因素的制约。就可以实现游戏规则的验证。
可考虑两种方式实现:(
1
)接口方式,如,自定义
Moveable
接口,表示可移动的对象,接口中定义方法
move
方法。在不同的实现类中根据传入的参数实现其移动的检验,若不合法,抛出异常,若合法,则执行移动。(
2
)抽象类方式,定义抽象类棋子,派生出“车”、“马”、“相”等具体类,在派生类中重写其移动方法。考虑本题采用抽象类和接口哪个更好?
4、
(选作,只需要思考)考虑军棋,其中部分棋子是可比较的,如
”
军长
”
,
”
师长
”
等。有些是不可以比较的,如“军旗”,“地雷”,“炸弹”,有些是可移动的,有些是不可移动的。有些是在特殊情况下可移动的,如“军旗”在“工兵”的占领下是可移动的。仿照上题的思路,考虑本题采用抽象类和接口哪个好?能否同时实现
Comparable
(系统定义)接口和
Moveable
(自定义)接口。
实验报告要求:
第
1
题由于涉及到排序需要提供主程序及测试结果数据。第
2
题只需写货币基类及人民币派生类的定义,不需主程序,但需要简单的测试用例。
4
、
5
由于工作量太大,不建议去实施。但建议大家都去思考。实验报告只写必作的内容。
附:
//
成绩类
public
class Score implements Comparable{
int code;
int English; //
英语成绩
int Math; //
数学成绩
int History; //
历史成绩
public
int compareTo(Object obj){
//
此处需要提供实现
;
}}
//
货币
public
class Currence {
public
static Map<String,Double> convert; //
汇率表,
public
String type; //
货币类型
public double value; //
币值
//
根据需要添加相应的方法
}
public
class RMB extendsCurrenceimplements Comparable {
//
此处需要提供实现
}