[英]Java: OOP concepts, Abstract class, interface
任务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;
}
}
现在,我需要编写一个我知道该怎么做的接口,但是我想弄清楚我是在声明接口内部的方法还是应该在抽象类中进行操作。 基本上,我需要一个帮助,以帮助我了解整个职业。 不知道主要方法应该使用哪个类。 我是一名新手,如果有人在我应该如何做的事情上帮助我,我真的很困惑,我敢肯定我自己就能做到。 不问代码是否需要帮助,如果有人简化了我整个练习
首先对现有代码进行注释。 我会在抽象超类中使用该构造函数,因为它会初始化该类中的字段。
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"
因此,我们使用继承来降低复杂性。 发起人不必关心它拥有哪种类型的体育俱乐部。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.