【问题标题】:Java: OOP concepts, Abstract class, interfaceJava:OOP 概念、抽象类、接口
【发布时间】:2016-02-15 09:15:06
【问题描述】:

任务 1. 设计和实现类 SportsClub(抽象类)、FootballClub。 课程应包括适当的方法并保存有关俱乐部名称、位置和有关俱乐部的各种统计数据的信息。 FootballClub 应包括统计数据,例如一个实例在本赛季取得的胜利、平局和失败次数、进球数和进球数。俱乐部目前的积分数,以及参加的比赛次数。

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

现在我需要编写一个我知道该怎么做的接口,但我试图弄清楚我是在接口内声明方法还是应该在抽象类中做。基本上我需要帮助我如何处理这整个 excersie。不知道我应该为 main 方法使用什么类。我是一个新学习者,如果有人帮助我解决我应该如何处理的问题,我真的很困惑,我相信我自己能够做到。如果有人简化我整个练习,请不要要求代码需要帮助

【问题讨论】:

  • 1) main 方法可以在任何类中。只需将其设置为程序的入口点。 2) 一个接口声明一个方法,但它没有实现它。将方法的实现留给子类。 3)您的抽象 SportsClub 类有太多变量 - 它太具体了。如果你想创建一个GolfSportsClub 怎么办?高尔夫没有“目标”......特定于一个类的变量应该放在那个类中,而不是父类。
  • 除此建议外,我们还需要一个特定问题才能回答您的问题。正如现在所写,你的问题太宽泛了。
  • 您在 SportsClub 中放置的统计数据过多。例如,积分、胜利、失败、平局、进球等对于 SportsClub 的其他子类可能毫无意义。请注意,说明说这些应该在 FootballClub 中。
  • 一个接口,以其最简单的形式,只定义方法头(即没有主体的方法)。您基本上说“想要支持我的界面的人必须实现此功能”(例如push(...) 和pop() 用于堆栈)。您不关心它们是如何实现的(这是实现您的接口的人的任务)。也许this 会有所帮助。

标签: java class oop interface abstract-class


【解决方案1】:

首先对现有代码进行评论。我会在抽象超类中使用该构造函数,因为它会初始化该类中的字段。

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 中添加方法: 公共抽象字符串 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"

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-17
    • 2016-08-30
    • 2011-12-21
    • 2011-04-23
    • 2014-07-15
    • 1970-01-01
    • 2014-02-08
    • 2011-05-22
    相关资源
    最近更新 更多