2012-11-13 3 views

답변

5

당신은이 같은 구현을 할 수있는 :

int score; 
static int scoremodifier; 

public static void increaseAllScore() { 
    scoremodifier++; 
} 

public int getScore() { 
    return score + Game.scoremodifier; 
} 
+0

을 사용하는 것이 좋습니다. 그게 내가 생각한 것입니다. 나는 이걸로 갈 것 같아. 나는 더 시원한 것이있을 것이라고 생각했다. 감사! – n00b

2

이 작업을 수행하는 유일한 방법은 정적 메서드가 Game 개체에 대한 참조에 액세스하는 메커니즘을 제공하는 것입니다. 이를 수행하는 한 가지 방법은 각 Game 객체를 정적 데이터 구조에 등록하는 것입니다.

예를 들어, 당신은이 작업을 수행 할 수 있습니다 세트가 가비지 수집 그것에 다른 참조가없는 경우 인에서 게임을 방해하지 않도록 내가 여기 WeakReference<Game>을 사용하고

public class Game { 
    private static Set<WeakReference<Game>> registeredGames 
     = new HashSet<WeakReference<Game>>(); 
    private int score; 

    public Game() { 
     // construct the game 
     registeredGames.add(new WeakReference(this)); 
    } 

    . . . 

    public static incrementAllScores() { 
     for (WeakReference<Game> gameRef : registeredGames) { 
      Game game = gameRef.get(); 
      if (game != null) { 
       game.score++; 
      } 
     } 
    } 
} 

.

+0

+1, 약한 참조 – bobah

1

기술적으로 가능하지만 일반적으로 나쁜 디자인입니다 *입니다. 대신 생성 된 모든 Game 인스턴스에 대한 참조를 보유 할 모든 게임 (class Games)의 컨테이너를 만듭니다. 대부분의 Games 클래스는 생성 된 모든 게임의 수명주기를 완전히 제어하는 ​​createGame() 메서드를가집니다.

Games 클래스를 사용하면 기본적으로 생성 된 모든 Game 인스턴스를 반복하여 모든 인스턴스의 점수를 1 점씩 올릴 수있는 비 정적 increaseAllScores() 메서드를 사용할 수 있습니다.

* - 모든 인스턴스의 static List<Game>을 만들고 해당 목록을 Game 생성자 내부에서 수정하십시오.

0

은이 문제에 대한 해결책의 개요 것 :

static final List<Game> games = new ArrayList<>(); 

public class Game { 
    public Game() { 
    games.add(this); 
    } 
} 

public static void increaseAllScore() { 
    for (Game g : games) game.increaseScore(); 
} 
0

이 가능하지만, 약간의 부기를 필요로한다. 본질적으로 기존의 모든 게임에 정적 인 포인터 세트를 보관해야합니다. 게임의 생성자에서는이 목록에 추가해야하며 소멸자에서 다시 제거해야합니다.

아마도 더 나은 방법은 scoreOffset 또는 이와 비슷한 정적 변수를 갖는 것입니다. 그런 다음 인스턴스 점수를 받아서 정적 인 scoreOffset을 추가하여 게임의 점수를 계산할 수 있습니다.

0

increaseAllScore 메서드에 Game 인스턴스에 대한 정적 액세스 권한이있는 경우에만 수행 할 수 있습니다 (인수 목록에서 전달하거나 정적으로 저장된 목록 있음).

0

불가능합니다. 먼저 객체 지향 프로그래밍의 기초를 배우십시오. 당신은 모든 게임에 대한 참조를 보유 할 수있는 작업 adound으로

:

public class Game { 
    private static List<Game> allGames = new ArrayList<Game>(); 

    public Game createNewGame() { 
     Game game = new Game(); 
     allGames.add(game); 
     return game; 
    } 

    public static void increaseAllGames() { 
     for (Game game : games) { 
      game.increaseScore(); 
     } 
    }  
} 

이 그냥 구현 예이다; 디자인을 위해 나는 같은 클래스에 넣지 않을 것이다.

관련 문제