[英]Connecting two classes java object-oriented
我希望創建兩個新類,我可以在其中連接它們。 我想創建一個玩家和團隊類。 我的目標是將一名球員分配到一支球隊。 基本上我希望在一個類中使用一個類作為屬性。
我想象我的播放器類是這樣的;
public class Player {
String first_name;
String last_name;
int age;
}
和我的團隊是這樣的;
public class Team {
String Member1;
String Member2;
}
和我的主要課程;
Player Player1 = new Player("Peter", "Jensen", 24);
所以我想做的是計算我的球員在特定球隊的平均年齡。 任何想法或提示?
在現實生活中,什么是團隊? 它是一群玩家,所以你需要讓Team
由Players
組成,然后問一個問題“哪里有最大量的信息來完成平均玩家年齡的計算?” 此信息放置在Team
類(玩家列表)中,我們需要將計算平均年齡的方法放置到Team
類中。 它被稱為信息專家原則,是眾多優秀的 oop 設計原則之一。
https://en.wikipedia.org/wiki/GRASP_(面向對象設計)#Information_expert
所以以這種方式代碼將是這樣的:
球員等級:
public class Player {
private String firstName;
private String lastName;
private int age;
public Player(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String firstName() {
return firstName;
}
public String lastName() {
return lastName;
}
public String age() {
return age;
}
}
團隊類:
public class Team {
private List<Player> players;
Team(List<Player> players) {
this.players = players;
}
public void add(Player player) {
players.add(player);
}
public void remove(Player player) {
players.remove(player);
}
public double averageAge() {
double sum = 0;
double amount = players.size();
for (Player player : players) {
sum += player.age();
}
return sum / amount;
}
}
之后,我們可以以各種方便的方式使用這些類,例如:
public class Test {
public static void main(String[] args) {
Team team = new Team(Arrays.asList(new Player[] {
new Player("Peter", "Jensen", 24),
new Player("Foo", "Bar", 50)
}));
System.out.println(team.averageAge()); // 37
}
}
簡單詢問團隊球員的平均年齡是多少,團隊會回復您。
在Team
類中創建一個 List 或一組玩家(如果允許的玩家數量固定)來表示玩家團隊。
示例:
class Team {
private List<Player> players = new ArrayList<>();
public void setPlayers(List<Player> players){
this.players = players;
}
public List<Player> getPlayers(){
return Collections.unmodifiableList(players);
}
}
然后創建您的對象列表:
Team team = new Team();
team.setPlayers(new ArrayList<>(Arrays.asList( new Player("Peter", "Jensen", 24),
new Player("Danny", "peters", 19),
new Player("Michael", "Jones", 32))));
那么你可以像這樣計算平均年齡:
double averageAge = team.getPlayers()
.stream()
.mapToDouble(Player::getAge)
.average().orElse(0); // 0 if no player present in the list
注意- 上面的例子使用了一個列表,但你可以很容易地只使用一個數組,它也使用流 API,如果你不熟悉它,那么你可以這樣做:
double averageAge = 0; // default if no player is present
List<Player> players = team.getPlayers();
for (Player player : players) {
averageAge += player.getAge();
}
if(players.size() >= 1) {
averageAge /= players.size();
}
如果由於某種原因您還希望能夠一次添加給定的玩家,那么您可以在Team
類中創建一個void addPlayer(Player player){...}
方法來獲取給定的玩家並將其添加到列表中球員。
在您的團隊中,您需要存儲一組球員:
public class Team{
private List<Player> players;
public Team() {
players = new ArrayList<?>();
}
public void addPlayer(Player player) {
players.add(player);
}
public Int getAverageAge() {
Int count =0;
Int sumAge=0;
for(Player player:players) {
sumAge+=player.getAge();//this getter should be in Player class
count++;
}
return sumAge/count;
}
}
使用 addPlayer() 方法將您的播放器添加到主類的列表中
您可以將 getter 和 setter 方法添加到播放器類。此外,如果您願意,可以在播放器類中執行以下操作:
public static Player newInstance(String n,String Sn,int age){
Player a=new Player(n,Sn,age);
return a;
}
現在您可以輕松地將玩家添加到團隊中。但是成員不能是String。我的建議是使用ArrayList。您可以找到很多關於此的文章。
你可以使用'for(Player a:ListName)'它會讓你的事情變得更容易。
我的解決方案
public class Team {
List<Player> allPlayer;
// constructor, getter and setters
}
和
public class Player {
String name;
// constructor, getter and setters
}
感謝您的幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.