我应该在此代码中使用接口吗?

时间:2014-08-12 17:11:43

标签: java interface

我有以下简单的课程

public class Athlete
{
    int Code;
    String Name;
    String Surname;
    Date DateOfBirth;

    public Athlete() {}
}

public class Game
{
    int Code;
    String Gamename;
    Date DateOfGame;

    public Game() {}
}

public class Participates
{
    int Code;
    Game game;
    Athlete athlete;
    float Performance;
    boolean Valid;

    public Participates() {}
}

如果我将参赛者课程宣布为运动员实施的界面或者这样好吗? (运动员可以参加很多比赛)

编辑1:这是我的代码示例,只是为了说明我的观点

编辑2:我的问题是关于此代码的优化,因此如果需要,不禁止对字段和方法进行更改

4 个答案:

答案 0 :(得分:1)

应该使用接口来描述行为。参与者或任何这些没有方法的类都不是这种情况。

如果要强制实现它的类具有一组特定的方法,请使用接口。

然而,只有在不同阶段由不同团队开发的应用程序或使用某些框架时,接口才是有意义的概念。如果你要在一个会话上自己开发一个应用程序,而不使用任何框架,那么使用它们可能没有任何意义。除非你想把它作为一种练习。

答案 1 :(得分:1)

您可以考虑根据以下内容分解对象模型:

  1. 作用
  2. 描述
  3. 派对,场所或事物
  4. 时刻或间隔(例如事件)
  5. 然后考虑特定对象的组合,并使用接口来处理多个对象类型可能合理实现的方法。

    您有一个Athelete课程(可能应该是person的角色,因为您有时可能会有referee。你有一个Game类(看起来不错,它看起来像是包含一个事件(当游戏发生时)。

    你定义了一个参与类..这看起来不是一个好类。您似乎想要将参与者封装在游戏中......这可以通过某种方法更好地处理。

    游戏类(包括isParticipant方法)

    package com.example.athletics;
    
    import java.util.ArrayList;
    import java.util.Date;
    
    public class Game {
        // Object fields
        int code;
        String name;
        Date gameDate; // perhaps an interval would be better here
    
        ArrayList<Athlete> players;
    
    
        public Game() {
            players = new ArrayList<Athlete>();
        };
    
        public void addPlayer(Athlete athlete) {
            players.add(athlete);
        }
    
        public boolean isParticipant(Athlete athlete) {
            // TODO improve performance by creating a HashMap perhaps?
    
            boolean result = false;
            for (int i=0; i < players.size(); i++) {
                if (athlete.equals(players.get(i))) {
                    result = true;
                    break;
                }
            }
            return result;
        }
    }
    

    运动员课程

    package com.example.athletics;
    
    import java.util.Date;
    
    public class Athlete {
    // Object fields
        int code;
        String Name;
        String surName;
        Date birthDate;
    
        public Athlete(){}
        // TODO methods to identify the Athlete
    
        public boolean equals(Athlete other) {
            if (other == null) {
                return false;
            } else {
                return code == other.getCode();
            }
        }
    
        public int getCode() {return code;}
    }
    

答案 2 :(得分:0)

我认为您不需要界面,但您需要延长参赛者的运动员。如果运动员参加比赛,运动员不应继承参赛者吗?这似乎是合乎逻辑的。

你也可以让参加一个没有任何继承人的课程,只需用它代表运动员等等。

答案 3 :(得分:0)

如果您没有计划创建两个实施,请不要添加界面。

如果您稍后发现需要第二个实现,请使用重构来提取接口,并添加第二个实现。