任务1.设计并实现类SportsClub(抽象类)、FootballClub。 类应包括适当的方法并保存有关俱乐部名称、位置以及有关俱乐部的各种统计数据的信息。 FootballClub 应包含统计数据,例如其实例在本赛季取得的胜场、平局和失利次数、进球数和进球数等统计数据。俱乐部当前拥有的积分数以及已参加的比赛数。
任务 2. 实现一个类 PremierLeagueManager,它扩展了 LeagueManager 接口(interface)。 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;
}
}
现在我需要编写一个接口(interface),我知道如何做到这一点,但我试图弄清楚我是在接口(interface)内部声明方法还是应该在抽象类中执行它。基本上我需要帮助我如何完成整个练习。不知道我应该使用哪个类作为 main 方法。我是一个新学习者,如果有人帮助我解决我应该如何处理的问题,我真的很困惑,我确信我自己能够做到。不要求代码需要帮助,如果有人简化我整个练习,请
最佳答案
首先是对现有代码的评论。我会在抽象父类(super class)中使用该构造函数,因为它初始化该类中的字段。
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 也更容易阅读。
现在回答你的问题。抽象类和接口(interface)之间的一个基本区别是接口(interface)是 100% 抽象并且没有状态(即没有字段)。因此,由于您的 SportsClub 拥有所有这些字段,因此它拥有一个状态,因此需要成为一个类。由于它不是一个完整的实现(大概您将添加实际体育俱乐部需要实现的更多方法,因为它与特定的运动相关),因此它需要是抽象的。
例如。任何体育俱乐部,无论什么运动,都可以发送有关比赛的广告。
因此,在 SportsClub
中添加以下方法:
公共(public)抽象字符串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 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"
因此我们使用继承来降低复杂性。发起人不必关心其拥有什么类型的体育俱乐部实例。
关于Java:OOP概念、抽象类、接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33698686/