在超类对象中使用子类对象
Using subclass objects in superclass object
我对 Java
有点陌生,所以我有一个相当愚蠢的问题:是否可以在 superclass 中拥有和使用 subclass 对象哪个也有构造函数?
这是我想要做的一个例子:我有 Superclass Team
和 subclass Player
。我想创建 Player
对象,其中包含 name
、surname
、height
等变量。我想访问 Team
class 中的这个 Player
对象,它有它的名称、位置和其他变量,以将 Player
对象分配到他在 Team
。比方说,Player: John Doe
在 Team
中,名为 Red
,他是 Goalkeeper
。
总而言之,是否可以在 main
函数中访问所有这些内容?例如我想打印出所有红队球员的名字。
抱歉,解释我想做的事情有点复杂,但这不是必须与 extends
做些什么吗?
是的,请看下面的代码。
public class Team{
public Player player;
}
class Player extends Team{
public Team team;
}
不过,当你说 Player
扩展 Team
时,我怀疑你的逻辑和设计,这实际上是说 Player
是 Team
。这意味着每个 Player
对象都会有一个玩家和位置列表(因为子类型从超类型继承非私有状态和行为),这在语义上没有多大意义。
我建议您改为像下面这样处理它。
public class Team{
public LinkedList<Player> players;
}
class Player{
public Position position; // Use some way of defining the player's position.
}
这意味着 Team
会有 Player
,而不是 Player
是 Team
简短的回答是,是的,这是可能的。
较长的答案是您误用了术语 superclass 和 subclass。你描述的关系不是is-a的继承关系,而是has-a的组合关系。
换句话说,您的 Player class 不会扩展您的 Team class。您的团队 class 将包含 Player 的实例。是的,在这种情况下,您的团队 class 可以访问这些实例的方法和变量,就像您可以访问任何其他 Java class 一样。它可能看起来像这样:
class Team{
List<Player> players = new ArrayList<Player>();
public void addPlayer(Player p, String position){
p.position = position;
players.add(p);
}
}
然后从 main() 方法中,您可以执行如下操作:
public class Main{
public static void main(String... args){
Team team = new Team("Fighting Cats");
Player p = new Player("Johnny Appleseed");
team.addPlayer(p, "Apple Picker");
}
}
您必须创建 3 个 classes 团队、玩家和一个客户 class 来输入数据。
我正在为您编写框架代码。它会让您了解如何编写代码
public class Team {
ArrayList<Player> player;
public ArrayList<Player> getPlayer() {
return player;
}
public void setPlayer(ArrayList<Player> player) {
this.player = player;
}
}
玩家
class Player{
String name;
Integer score;
Integer Rank;
//getter setters
}
客户class
public class Client {
public static void main(String[] args) {
Player pOne = new Player();
pOne.setRank(2);
pOne.setName("ABD");
Player pTwo=new Player();
pTwo.setRank(2);
pTwo.setName("SPC");
pTwo.setTotal(60);
ArrayList<Player> playerList = new ArrayList<Player>();
playerList.add(pOne);
playerList.add(pTwo);
Team team=new Team();
one.setPlayer(playerListOne);
//get the player using Team class's getPlayer method & print
}
您无需使用 extends
,而是专注于 OO 设计。
你要找的是组合而不是继承(即 Team
"has a" Player
。"A Player
is a Team
" 没有多大意义)
class Player {
String name;
String surname;
String height;
}
class Team {
String name;
List<Player> players;
}
当我们考虑球队和球员时,它的关系是球队有球员。
在设计 classes 时使用相同的关系。
Position 是 属性 ,与 Player 的范围相关。所以在正确的级别引入 属性。最好让团队 class 拥有自己的属性。
我对 Java
有点陌生,所以我有一个相当愚蠢的问题:是否可以在 superclass 中拥有和使用 subclass 对象哪个也有构造函数?
这是我想要做的一个例子:我有 Superclass Team
和 subclass Player
。我想创建 Player
对象,其中包含 name
、surname
、height
等变量。我想访问 Team
class 中的这个 Player
对象,它有它的名称、位置和其他变量,以将 Player
对象分配到他在 Team
。比方说,Player: John Doe
在 Team
中,名为 Red
,他是 Goalkeeper
。
总而言之,是否可以在 main
函数中访问所有这些内容?例如我想打印出所有红队球员的名字。
抱歉,解释我想做的事情有点复杂,但这不是必须与 extends
做些什么吗?
是的,请看下面的代码。
public class Team{
public Player player;
}
class Player extends Team{
public Team team;
}
不过,当你说 Player
扩展 Team
时,我怀疑你的逻辑和设计,这实际上是说 Player
是 Team
。这意味着每个 Player
对象都会有一个玩家和位置列表(因为子类型从超类型继承非私有状态和行为),这在语义上没有多大意义。
我建议您改为像下面这样处理它。
public class Team{
public LinkedList<Player> players;
}
class Player{
public Position position; // Use some way of defining the player's position.
}
这意味着 Team
会有 Player
,而不是 Player
是 Team
简短的回答是,是的,这是可能的。
较长的答案是您误用了术语 superclass 和 subclass。你描述的关系不是is-a的继承关系,而是has-a的组合关系。
换句话说,您的 Player class 不会扩展您的 Team class。您的团队 class 将包含 Player 的实例。是的,在这种情况下,您的团队 class 可以访问这些实例的方法和变量,就像您可以访问任何其他 Java class 一样。它可能看起来像这样:
class Team{
List<Player> players = new ArrayList<Player>();
public void addPlayer(Player p, String position){
p.position = position;
players.add(p);
}
}
然后从 main() 方法中,您可以执行如下操作:
public class Main{
public static void main(String... args){
Team team = new Team("Fighting Cats");
Player p = new Player("Johnny Appleseed");
team.addPlayer(p, "Apple Picker");
}
}
您必须创建 3 个 classes 团队、玩家和一个客户 class 来输入数据。 我正在为您编写框架代码。它会让您了解如何编写代码
public class Team {
ArrayList<Player> player;
public ArrayList<Player> getPlayer() {
return player;
}
public void setPlayer(ArrayList<Player> player) {
this.player = player;
}
}
玩家
class Player{
String name;
Integer score;
Integer Rank;
//getter setters
}
客户class
public class Client {
public static void main(String[] args) {
Player pOne = new Player();
pOne.setRank(2);
pOne.setName("ABD");
Player pTwo=new Player();
pTwo.setRank(2);
pTwo.setName("SPC");
pTwo.setTotal(60);
ArrayList<Player> playerList = new ArrayList<Player>();
playerList.add(pOne);
playerList.add(pTwo);
Team team=new Team();
one.setPlayer(playerListOne);
//get the player using Team class's getPlayer method & print
}
您无需使用 extends
,而是专注于 OO 设计。
你要找的是组合而不是继承(即 Team
"has a" Player
。"A Player
is a Team
" 没有多大意义)
class Player {
String name;
String surname;
String height;
}
class Team {
String name;
List<Player> players;
}
当我们考虑球队和球员时,它的关系是球队有球员。 在设计 classes 时使用相同的关系。 Position 是 属性 ,与 Player 的范围相关。所以在正确的级别引入 属性。最好让团队 class 拥有自己的属性。