如何指定抽象 parent 字段的子类
How to specify subclass of abastract parent's field
所以我想做的是在抽象 class 上有一个字段,当这个抽象 class 在他们的 child 上继承时能够有那个字段作为摘要中所述 class 的 child parent.
例如,我有一个抽象的 Player class,然后是继承 Player 的 Client 和 Opponent(用于多人游戏)。 Player 有一个 Unit 类型的字段。 Unit本身由ClientUnit和OpponentUnit继承。我知道我可以只为我的客户端构造函数传递一个 ClientUnit 并将其分配为单元(继承,duh),但是我怎么会有一个 getter returns 它以 ClientUnit object 没有例外的风险和 what-not?
编辑:我添加了一些代码以更好地解释问题。
public abstract class Player {
private Unit unit;
public void setUnit(Unit unit) {
this.unit = unit;
}
public Unit getUnit() {
return unit;
}
}
public class Client extends Player {
@Override
public ClientUnit getUnit() {
return (ClientUnit)super.getUnit();
}
}
这似乎可行,但我不知道这是否是一种 safe/robust 方法。
您应该将父 class 的字段设置为 protected
而不是 private
。这样就可以在 subclass.
中访问该字段
我不确定我是否理解了你的问题,但也许Type Parameters可以帮助你:
public abstract class Player<T extends Unit> {
private T unit;
public Player(T unit) { }
public T getUnit() {
return unit;
}
public void setUnit(T unit) {
this.unit = unit;
}
}
和实施 class:
public class Client extends Player<ClientUnit> {
public Client(ClientUnit unit) {
super(unit);
}
public static void main(String[] args) {
Client client = new Client(new ClientUnit());
ClientUnit unit = client.getUnit();
}
}
所以我想做的是在抽象 class 上有一个字段,当这个抽象 class 在他们的 child 上继承时能够有那个字段作为摘要中所述 class 的 child parent.
例如,我有一个抽象的 Player class,然后是继承 Player 的 Client 和 Opponent(用于多人游戏)。 Player 有一个 Unit 类型的字段。 Unit本身由ClientUnit和OpponentUnit继承。我知道我可以只为我的客户端构造函数传递一个 ClientUnit 并将其分配为单元(继承,duh),但是我怎么会有一个 getter returns 它以 ClientUnit object 没有例外的风险和 what-not?
编辑:我添加了一些代码以更好地解释问题。
public abstract class Player {
private Unit unit;
public void setUnit(Unit unit) {
this.unit = unit;
}
public Unit getUnit() {
return unit;
}
}
public class Client extends Player {
@Override
public ClientUnit getUnit() {
return (ClientUnit)super.getUnit();
}
}
这似乎可行,但我不知道这是否是一种 safe/robust 方法。
您应该将父 class 的字段设置为 protected
而不是 private
。这样就可以在 subclass.
我不确定我是否理解了你的问题,但也许Type Parameters可以帮助你:
public abstract class Player<T extends Unit> {
private T unit;
public Player(T unit) { }
public T getUnit() {
return unit;
}
public void setUnit(T unit) {
this.unit = unit;
}
}
和实施 class:
public class Client extends Player<ClientUnit> {
public Client(ClientUnit unit) {
super(unit);
}
public static void main(String[] args) {
Client client = new Client(new ClientUnit());
ClientUnit unit = client.getUnit();
}
}