好的,所以我有整个模块负责在我的游戏中生成玩家类,经过几个小时和几个小时的艰苦劳动,我想出了这个层次结构(代码片段没有使它太过图形化,但仍然提供足够的余地)这是建立类层次结构的正确方法吗?
我有实体(其或者是Player或怪兽)碱接口:
public interface Entity {
public int getHP();
...
// all getters that denote all stats the Entities have in my game, nothing
else is in the interface
}
然后是第二界面延伸Entity
,称为Classes
,包含所有相关类制定者:
public interface Classes extends Entity {
void setHP(int a);
... //and so on}
最后有一些真正的阶级,阶层PlayerClasses
负责建设类:
public class PlayerClasses implements Classes {
private int HP, ATK, DEF, DAMAGE, DROP;
@Override
public int getHP() {
return HP;
}
@Override
public void setHP(int a) {
HP = a;
}
// this is how I build the player class
public void Rogue(){
setHP(150);
setATK(30);
setDEF(20);
setDAMAGE();
}
最后一类的构造函数用于创建播放器实例,然后将其传递到其他模块(没有继承或直接访问的任何其他类别字段或需要在构造函数中的任何状态,所以赢吧?)
public class Player {
private int HP,ATK,DEF,DAMAGE,DROP;
private PlayerClasses c;
public Player() {
c = new PlayerClasses();
c.Rogue();
HP = c.getHP();
ATK = c.getATK();
DEF = c.getDEF();
DAMAGE = c.getDAMAGE();
DROP = c.getDrop();
}
类长的问题,但我试图保持它的公民。任何反馈非常感谢。
编辑:好的,以澄清为什么我选择这样设计,我希望播放器实例是不可变的对象,只能使用正确的值实例化,同时保持其他模块中的初始化尽可能没有任何依赖关系。例如,如果模块中的实例显示玩家属性和怪物属性,则来自两个不同玩家类的值不能混淆。我觉得在继承中传递私有的HP和ATK变量,然后使用相同的变量拉动命名空间不是一种方法。
有没有*正确*的方式,但这不是一个*好*方式,恕我直言。为什么不用你的'Entity'接口,然后像'Player implements Entity'这样的类?如果你有一些共享共同价值的类,可以引入类似“玩家延伸生物”,“怪物延伸生物”,“生物实现实体”等。 –
这个问题太广泛了。除非你澄清你为什么决定创建上述层次结构,以及你需要什么建议,否则你的问题可能得不到有效答案 –
在课堂设计中没有“错误”,但有“这看起来很奇怪”。你需要那么多的接口,然后委托给隐藏的类吗?你可以创建具有不同默认值的'Player'的子类 – zapl