2015-11-13 94 views
0

任务1.设计和实现类SportsClub(抽象类),FootballClub。 课程应包括适当的方法,并保存有关俱乐部名称,其位置和关于俱乐部的各种统计信息。 FootballClub应包含统计数据,例如胜利,平局和失败数,以及本赛季已取得的进球数和得分情况。俱乐部目前拥有的积分数量和比赛次数。Java:面向对象的概念,抽象类,接口

任务2.实现扩展接口LeagueManager的PremierLeagueManager类。 PremierLeagueManager班级拥有许多在首屈一指的联盟中发挥作用的足球俱乐部。该类应创建一个基于文本输入的菜单,给用户的选择: •

  1. 创建一个新的足球俱乐部在英超联赛中添加它。 •

  2. 删除(贬)现有的足球从英超

  3. 显示选定俱乐部的各种统计俱乐部。
  4. 显示英超表

我设计的抽象类

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;  
    } 
} 

现在我需要写,我知道怎么做了一个接口,但我想围绕让我的头我会宣布我的方法nside界面或我应该抽象类。基本上我需要一个帮助,我如何能够接近这个整体表现。不知道我应该为主要方法使用什么类。我是一个新的学习者,如果有人帮我解决我应该如何处理,我真的很困惑,我确信我将能够自己做。不要求代码需要帮助,如果有人简化我这整个excerise请

+0

1)'main'方法可以在任何类中。只需将其设置为程序的入口点即可。 2)一个接口*声明了一个方法,但它没有实现它。将方法的实现留给子类。 3)你的抽象SportsClub课程有太多变数 - 它太具体。如果你想制作一个“GolfSportsClub”呢?高尔夫没有“目标”......特定于一个类别的变量应该在该类别中,而不是在父类中。 –

+1

除了这个建议之外,我们还需要一个具体的问题来回答你的问题。正如现在写的,你的问题太广泛了。 –

+0

您在SportsClub中放置了太多统计数据。例如,对于SportsClub的其他一些子类,积分,胜利,失败,抽签,进球等可能没有意义。请注意,说明中指出这些应该在FootballClub中。 – FredK

回答

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可以做一个nouncements。

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" 

所以我们使用了继承来降低复杂性。发起人不必关心它有什么类型的体育俱乐部实例。