2014-10-11 15 views
1

Здравствуйте, мне нужна помощь в следующем задании домашней работы, которое у меня есть.Интерфейс и наследование java

Это только часть проблемы, но мне нужна помощь только с этой частью.

Я хочу создать небольшую систему, которая имитирует Олимпийские игры. Есть три вида спорта, которые я хочу имитировать, плавать, ездить на велосипеде и бегать. Есть четыре типа спортсменов, которые я хочу использовать, пловцы, велосипедисты, спринтеры (которые могут соревноваться в плавании, езде на велосипеде и бег соответственно) и superAthletes, которые могут соревноваться во всех трех играх (у меня с большинством проблем) , У каждого спортсмена должен быть метод compete(), который будет произвольно генерировать время от 10 до 20 секунд для бега, от 100 до 200 секунд для плавания и от 500 до 800 секунд для езды на велосипеде, это время будет использовано для отвлечения победителя за игру.

Мой вопрос заключается в том, как имитировать эту проблему, какие классы использовать, и каковы будут их отношения. Мне нужен способ создания разных игровых объектов, таких как SwimGame, в которых есть список только для плавания и супер спортсмена.

Это мой подход.

Итак, у меня будет базовый абстрактный класс спортсмена, а велосипедист, бегун-пловец и суперастлет, выйдут из этого класса.

У меня также будет класс абстрактных игр, и здесь будут расширяться игры SwimGame, CycleGame и RunningGame. В каждой игре будет список спортсменов, которые участвуют в игре.

Как я смогу предотвратить бегун добавить плавать игру, и подобные ситуации

как будет Выражаю Рассчитайте время, когда superAthleat может участвовать во всех 3 играх

На Сначала я думал, что я делаю 3 интерфейса:

interface swimInterface() { 
    public void calculateSwimTime(); 
} 

interface runInterface() { 
    public void calculateRunTime(); 
} 
interface cycleInterface() { 
    public void calculateCycleTime(); 
} 

, а затем сделать swimmerAthleate реализовать swimInterface, то runAthlete реализации г unInterface, cycleAthlete реализовать cycleInterface, а самое главное superAthlete реализует runInterface, swimmerInterface и cycleInterface, так что я бы что-то вроде этого:

public abstract class Athlete { 
    ... 
    // what should be here 
} 

public class SwimAthlete extends Athlete implements SwimInterface { 

    ... 
    public void calculateSwimTime() {...} 
} 

public class RunAthlete extends Athlete implements RunInterface { 

    ... 
    public void calculateRunTime() {...} 
} 

public class CylcleAthlete extends Athlete implements CycleInterface { 

    ... 
    public void calculateCycleTime() {...} 
} 

public class SuperAthlete extends Athlete implements SwimInterface, CycleInterface, RunInterface() { 

    public void calculateSwimTime() {...} 
    public void calculateRunTime() {...} 
    public void calculateCycleTime() {...} 

}

Но у меня есть много других проблем: Если у меня есть что-то вроде этого:

public class Game { 
    ArrayList<Athlete> listOfCompetitors; 
    public Game(){ 
     listOfCompetitors = new ArrayList<Athlete>(); 
    } 
} 

public class SwimGame extends Game { 
    // I could have something like this here 
    // how could I add only SwimAthlete and SuperAthlete here 

    // how to traverse the array of athletes and only call calculateSwimTime method. 

} 

// similar for other games. 

Если вам нужно больше объяснений, я более чем готов обсудить этот вопрос.

+0

Вопрос: Рассматривали ли вы добавление класса «Событие», что «имеет» игру и атеатр? И может также запретить «пловец» спортсменов участвовать в «Бегущих» играх? – FoggyDay

+0

Когда вы вызываете 'compete()', как вы узнаете, какое событие участвует в соревнованиях? Было бы лучше иметь отдельный интерфейс для каждого события, каждый со своим собственным методом ('swim()', 'run()' и т. Д.), А затем каждый тип спортсмена реализует интерфейсы для любых типов событий разрешено конкурировать. – azurefrog

+0

Хорошо, я использовал этот подход, но тогда у меня есть проблема, как вызывать эти методы из разных игр. Я обновлю свой вопрос, чтобы отразить эту ситуацию. – aleksamarkoni

ответ

0
interface Sport 
{ 
    void compete(); 
} 

abstract class Athlete implements Sport 
{ 
    String name; 

    int time = 0; 

    void setName(String name) 
    { 
     this.name = name; 
    } 

    void setTime(int time) 
    { 
     this.time = time; 
    } 

    String getName() { return name; } 
    int getTime() { return time; } 
} 

class Runner extends Athlete 
{ 
    Runner(String name) 
    { 
     setName(name); 
    } 

    @Override 
    public void compete() 
    { 
     int time = 10 + (int) (Math.random() * ((20d - 10d) + 1d)); 

     setTime(time); 
    } 
} 

class Swimmer extends Athlete 
{ 
    Swimmer(String name) 
    { 
     setName(name); 
    } 

    @Override 
    public void compete() 
    { 
     int time = 100 + (int) (Math.random() * ((200d - 100d) + 1d)); 

     setTime(time); 
    } 
} 

class Cyclist extends Athlete 
{ 
    Cyclist(String name) 
    { 
     setName(name); 
    } 

    @Override 
    public void compete() 
    { 
     int time = 500 + (int) (Math.random() * ((800d - 500d) + 1d)); 

     setTime(time); 
    } 
} 
+0

Хорошо, что делать с superAthlete, который может соревноваться во всех трех играх. – aleksamarkoni

Смежные вопросы