这个游戏的类设计(java)

时间:2016-09-02 18:07:02

标签: java inheritance

我是一名编程爱好者,想要制作一个Java程序来实现我的城市游戏的自动化(我和我哥哥玩的小玩具车的真实游戏)。它不是100%的家庭作业或学校问题。

我制作了一个Citizen课程和一个Jobs课程。每个工作都有一个名字,基本收入,收入乘数(工作等级)。

我想为每个工作制作对象,并将每个公民连接到它,但我有这些问题:

  1. 如果两个人有相同的工作,就会创建两个工作对象(我想成为一个);
  2. 我不知道是否应该为每个工作单独制作课程(子课程),或者如果玩家在初始化新公民时有新工作,则创建一个新的工作对象。

3 个答案:

答案 0 :(得分:1)

  

如果两个人有相同的工作,就会创建两个工作对象(我想成为一个)

两个主要选项:

  1. 将每个作业实例设为Singleton(如果您不知道单身是什么,只需谷歌搜索或在此处搜索)。
  2. 创建一个包含Job Manager(或SetMap,但您可能需要List)的单身Set类,将作业名称配对到那个工作班的一个例子;然后你可以简单地获得一个参考,而不是创建一个新的。
  3.   

    我不知道是否应该为每个工作单独制作课程(子课程),或者如果玩家在初始化新公民时有新工作,则创建一个新的工作对象。

    你可能不应该这样做。相反,将所有作业共有的内容作为abstract父类,然后将每个作业类实现为扩展。但是,如果您只需要Job类中的变量来为每个单独的作业包含不同的值,那么您需要单个Job类的多个instances,每个类都有自己的一组值。例如:

    class Job{
      public String name;
      public float salary;
      public float multiplier;
    
      public Job(String name, float salary, float multiplier){
        this.name=name;
        this.salary=salary;
        this.multiplier=multiplier;
      }
    }
    
    //On Main
    Job banker = new Job("Banker", 9000, 1);
    Job seniorBanker = new Job("Senior Banker", 9000, 1.2f);
    Job plumber = new Job("Plumber", 800, 1);
    
    //...
    //Assuming citizen class contains Job variable: public Job job;
    Citizen jack = new Citizen(); 
    jack.job = banker;
    Citizen mario = new Citizen(); 
    mario.job = plumber;
    Citizen luigi = new Citizen(); 
    luigi.job = plumber; //Same instance of 'plumber' as mario's...
    //If you change the value of the plumber's job salary, and then do...
      //system.out.println(mario.job.salary);
      //system.out.println(luigi.job.salary);
    //...both will be changed.
    

    注意:正如您在上面所看到的,您当前的设计(从可以推断的内容)不会重复使用以前作业层中的数据,使multiplier多余且有点无意义。 更好的设计是将作为Map的工作类内置的排名,与特定名称和乘数配对。

    确认注意事项:这基本上会将Job类转换为Profession类的等价物,这是garnulf在his answer中的建议。

答案 1 :(得分:0)

class Citizen{
    String name;
         .
         .
         .
    Job job; 
}


class Job{
   // all fields you need
}

现在只需使用不同的参数实例化Job对象,然后在创建Citizen对象时,只需使用作业变量(在Citizen类中)来引用Job对象。因此,多个公民对象可以引用相同的Job对象。

答案 2 :(得分:0)

我认为您应该区分JobProfession。每个Citizen应该拥有自己的Job,因为例如salaryemployer是独立的。但每个Job也与Profession相关联,而Object与共享相同Citizen的不同Profession相同enum。对Profession使用Object可能是一个好主意,这样您就强制每个Profession只有一个 ans = (A + B) - N + 1