任务1.设计并实施SportsClub(抽象类),FootballClub类。 课程应包括适当的方法,并保存有关俱乐部名称,位置和俱乐部各种统计数据的信息。 FootballClub应该包括统计数据,例如在本赛季中有多少胜利,抽签和失败,获得和得分的目标数量。俱乐部目前拥有的积分数和比赛次数。
任务2.实现一个扩展接口LeagueManager的类PremierLeagueManager。 PremierLeagueManager课程维持着许多在英超联赛中发挥作用的足球俱乐部。该类应基于文本输入创建菜单,并为用户提供以下选择: •
创建一个新的足球俱乐部并将其添加到英超联赛中。 •
删除(降级)来自英超联赛的现有足球俱乐部
我设计了抽象类
public abstract class SportsClub {
int position;
String name;
int points;
int wins;
int defeats;
int draws;
int totalMatches;
int goalF;
int goalA;
int goalD;
String location;
}
我扩展了抽象类,我知道我可以使用get / set方法但是我使用了构造函数来初始化(如果我知道的话,请纠正我)
public class FootballClub extends SportsClub {
FootballClub(int position, String name,
int points, int wins,
int defeats, int draws,
int totalMatches, int goalF,
int goalA, int goalD) {
this.position = position;
this.name = name;
this.points = points;
this.wins = wins;
this.defeats = defeats;
this.draws = draws;
this.totalMatches = totalMatches;
this.goalF = goalF;
this.goalA = goalA;
this.goalD = goalD;
}
}
现在我需要编写一个我知道该怎么做的接口,但我正试图解决这个问题,我在界面中声明了方法,或者我是否应该在抽象类中进行。基本上我需要一个帮助我如何接近这整个excersie。不知道我应该为main方法使用哪个类。我是一个新学习者,如果有人帮助我解决我应该如何接近我真的很困惑我相信我能够自己做。不要求代码需要帮助,如果有人简化我这整个请求
答案 0 :(得分:2)
首先评论现有代码。我想在抽象超类中构造函数,因为它初始化了该类中的字段。
public abstract class SportsClub {
SportsClub(int position, String name, int points, int wins, int defeats, int draws, int totalMatches, int goalF, int goalA, int goalD){
this.position = position
...
然后
public class FootballClub extends SportsClub{
FootballClub(int position, String name, int points, int wins, int defeats, int draws, int totalMatches, int goalF, int goalA, int goalD) : base(position, name, points, wins, defeats, draws, totalMatches, goalF, goalA, goalD) {
}
这使得它对下一个子类更具可重用性。同样作为一般规则,每当我看到方法/构造函数的这么多参数时,我创建一个结构/类来包含它们(例如,例如ClubInfo
)。这种方式不那么冗长,类的API更容易阅读。
现在回答你的问题。抽象类和接口之间的一个基本区别是接口是100%抽象的并且没有状态(即没有字段)。因此,由于您的SportsClub拥有所有这些领域,它拥有一个州,因此需要成为一个班级。由于它不是一个完整的实现(可能你会添加更多的方法,实际的体育俱乐部需要实施,因为它与特定的运动相关),它需要是抽象的。
例如。任何体育俱乐部,无论运动,都可以发送有关比赛的广告。
所以在SportsClub
中添加方法:
public abstract string AnnounceGame();
现在,宣布游戏的方式因运动而异:
所以FootballClub
可能会这样实现:
public string AnnounceGame() { return "Come join us at the stadium"; }
虽然BaseballClub
可能会这样做:
public string AnnounceGame() { return "Come join us at the ball park"; }
基本的想法是,如果你是一个体育推动者课程,例如,你不关心你拥有什么类型的体育俱乐部,你知道任何SportsClub
都可以发布公告。
SportsClub clubA = new FootballClub();
SportsClub clubB = new BaseballClub();
如果我打电话:
clubA.AnnounceGame(); // outputs "Come join us at the stadium"
clubB.AnnounceGame(); // outputs "Come join us at the ball park"
所以我们使用继承来降低复杂性。发起人不必关心它拥有什么类型的体育俱乐部实例。