Наследование и где объявить предполагаемый универсальный объект - PullRequest
0 голосов
/ 22 февраля 2009

У меня есть класс Player, который наследуется от класса ArmedHumanoids, который, в свою очередь, наследуется от класса Humanoids.

Где и когда я должен создать объект Player, чтобы он был доступен во всех других моих классах - например, в классе selectPlayerRace?

Я знаю, что, расширяя класс Player, он становится доступным, но я расстроен, потому что все остальные мои классы расширяются JFrame. Расширение может быть только одно, а не два.

В настоящий момент NetBeansIDE жалуется, что не может найти объект Player, когда я его кодирую в selectPlayerRace, после создания объекта Player в моем классе Main.

Очевидно, что я счастливее, когда я создаю объект Player в классе selectPlayerRace, но тогда я не могу получить доступ к объекту Player во всех других моих классах, поскольку он является внутренним для selectPlayerRace.

Объект Player предназначен для того, чтобы быть универсальным объектом, доступным во всех других моих классах.

Ответы [ 5 ]

4 голосов
/ 22 февраля 2009

Объект Player предназначен для универсальный объект, доступный во всех моих другие классы.

Почему бы просто не передать этот Player объект в конструктор других классов или в вызываемые вами методы?

2 голосов
/ 22 февраля 2009

Вы можете создать объект вашего класса Player и передать его другим объектам, например, через. конструктор или метод, который принимает тип Player.

public class Entry
{
   public static void main(string[] args)
   {
      // initialize a player object
      Player player=new Player("elwynn");
      // initialize some other object which requires player object.
      // since player object needs to be accessed within foo.
      Foo foo = new Foo(player);
      // you are about to use player object within foo.
      foo.MakePlayerPlay(); 
   } 
} 

public class Foo
{

  Player player;
  public Foo(Player p)
  {
   this.player = p;
  }

  public void MakePlayerPlay()
  {
    // you are using player object here
    // which is the same instance you created 
    // within main() in Entry class.
    if(this.player!=null) this.player.play();
  }

}
0 голосов
/ 23 февраля 2009

Звучит как шаблон синглтона.

public class Player extends ArmedHumanoid {

  private static Player instance = new Player();

  private Player() {}

  public static Player getIntstance() {
    return instance
  }

}

Тогда любой класс может вызвать Player.getInstance(), чтобы получить доступ к объекту Player.

0 голосов
/ 22 февраля 2009

Это плохой стиль иметь глобальные объекты, потому что это

  • усложнит тестирование, а

  • вызовет проблемы, когда возникнет необходимость иметь более одного экземпляра.

Лучше давать ссылки на другие объекты в процессе конструирования (это называется внедрением зависимостей) на основе необходимости знать или, где это уместно, передавать ссылки по параметру.

Тем не менее, посмотрите шаблон проектирования Singleton.

0 голосов
/ 22 февраля 2009

Похоже, вы ищете здесь объявление static. Насколько я понимаю, вы хотите получить глобальный доступ к некоторому экземпляру Player, но для этого не нужно extend какой-то другой класс или implement какой-либо интерфейс (что означает, что вам не нужно наследовать какое-либо поведение, вы просто хочу получить доступ к одному объекту). Вы можете сохранить экземпляр Player, к которому хотите получить доступ static, например. в классе PlayerManagement. Затем вы помещаете в него статический метод, например getPlayer(String playerName), который синхронизирует доступ к его массиву / Vector / всему, что содержит все объекты Player, и затем возвращает соответствующий объект (или null, если не найден). Вы можете связать свои классы гуманоидов с PlayerManagement и наоборот.

Может быть, вы также хотите игрока interface. Вы можете реализовать столько интерфейсов, сколько захотите, но расширить только один другой класс, но вам нужно переопределить все функциональные возможности, поскольку вы не можете написать какой-либо код в интерфейс, просто определите, какие атрибуты / методы должен обеспечить класс, реализующий этот интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...