制作由其继承的子 class 组成的超级 class 是不好的做法吗?
Is it bad practice to make a super class composed of its inherited subclass?
我有 2 个 classes,一个玩家和一个武器。两者都有一个 hp 实例(代表武器的耐用性)和一个“名称”实例。因此,如果我想访问武器的 hp,我不必在武器 class 中重新创建 getHp 方法,因为它已经在玩家 class 中。那就是继承。
但是,我也希望玩家构造函数中有武器。这就是 subclass 的组成。问题是,武器 class 必须继承玩家构造函数中的武器对象,所以我只在 super().
中输入 null
public class Player {
private int hp;
private String name;
private int speed;
private ArrayList<Weapon> wList; //There is a list of weapons in the player class
public Player(int h, Weapon w, String n, int s) {
hp = h;
name = n;
currentW=w;
speed=s;
wList = new ArrayList<>();
public int getHp() {
return hp;
}
public String getName() {
return name;
}
}
public class Weapon extends Player {
private int damage;
public Weapon(int h, String n, int damage) {
super(h, null,n, 0)
this.damage = damage;
}
如果这是不好的做法,是否有另一种方法可以在播放器构造函数中拥有武器,而不必重新编写 getter 方法?
是的,这是一种不好的做法。这样的架构将导致很难遵循代码。您需要做的是创建一个摘要 class 并将一些信息移至其中,并让您的武器和玩家 class 扩展它。
public abstract class AbstractHealthObject {
private String name;
private int hp;
public AbstractHealthObject(String name, int hp) {
setName(name);
setHp(hp);
}
//add getters and setters
}
public class Player extends AbstractHealthObject {
//instance variables
public Player(int h, Weapon w, String n, int s) {
super(h, n);
//set instance variables
}
}
public class Weapon extends AbstractHealthObject {
public Weapon(String name, int hp, int damage) {
super(name, hp);
//set instance variables
}
}
我有 2 个 classes,一个玩家和一个武器。两者都有一个 hp 实例(代表武器的耐用性)和一个“名称”实例。因此,如果我想访问武器的 hp,我不必在武器 class 中重新创建 getHp 方法,因为它已经在玩家 class 中。那就是继承。 但是,我也希望玩家构造函数中有武器。这就是 subclass 的组成。问题是,武器 class 必须继承玩家构造函数中的武器对象,所以我只在 super().
中输入 nullpublic class Player {
private int hp;
private String name;
private int speed;
private ArrayList<Weapon> wList; //There is a list of weapons in the player class
public Player(int h, Weapon w, String n, int s) {
hp = h;
name = n;
currentW=w;
speed=s;
wList = new ArrayList<>();
public int getHp() {
return hp;
}
public String getName() {
return name;
}
}
public class Weapon extends Player {
private int damage;
public Weapon(int h, String n, int damage) {
super(h, null,n, 0)
this.damage = damage;
}
如果这是不好的做法,是否有另一种方法可以在播放器构造函数中拥有武器,而不必重新编写 getter 方法?
是的,这是一种不好的做法。这样的架构将导致很难遵循代码。您需要做的是创建一个摘要 class 并将一些信息移至其中,并让您的武器和玩家 class 扩展它。
public abstract class AbstractHealthObject {
private String name;
private int hp;
public AbstractHealthObject(String name, int hp) {
setName(name);
setHp(hp);
}
//add getters and setters
}
public class Player extends AbstractHealthObject {
//instance variables
public Player(int h, Weapon w, String n, int s) {
super(h, n);
//set instance variables
}
}
public class Weapon extends AbstractHealthObject {
public Weapon(String name, int hp, int damage) {
super(name, hp);
//set instance variables
}
}