Можно ли установить значения по умолчанию для унаследованных полей в подклассах? - PullRequest
2 голосов
/ 23 мая 2010

Я пытаюсь установить значение по умолчанию для унаследованных полей от суперклассов.

Итак, моя иерархия классов такова:

Character -> Enemy -> Boss\-> Hero

Каждый Character имеет public static char avatar для представления его на игровом поле ASCII.

Как установить значение по умолчанию для avatar каждого классаунаследовано от Character?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 23 мая 2010

Вы можете установить его в конструкторе. Например:

public class Hero extends Character {
    public Hero() {
        avatar = 'H';
    }
}

Но для того, чтобы это работало, свойство аватара не должно быть статичным (иначе все ваши аватары будут такими же, как установлено в конструкторе последнего экземпляра класса). Ваш класс Character должен выглядеть примерно так (при условии, что вы хотите использовать аватар по умолчанию для классов, которые не устанавливают их в конструкторе):

public class Character {
    public char avatar;
    public Character() {
        avatar = 'A';
    }
}
2 голосов
/ 23 мая 2010

Аватар не может быть статическим полем, потому что если вы измените его в любом из подклассов, он будет изменен для всех подклассов. Вы можете реализовать это следующим образом.

public class Character{
     public char avatar = '';
     public Character(char avatar){
          this.avatar = avatar;
     }
}

public class Enemy extends Character{
     public Enemy(char avatar){
          super(avatar);
     }
}

public class Boss extends Enemy{
     public Boss(char avatar){
          super(avatar);
     }
}

public class Hero extends Character{
     public Hero(char avatar){
          super(avatar);
     }
}

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

1 голос
/ 23 мая 2010
  • не использовать static
  • установить значение по умолчанию с помощью private char avatar = 'A'
  • предоставляет getAvatar() и setAvatar(char c) методы, которые изменяют аватар
  • в конструкторе подклассов вызывать сеттер с нужными значениями
0 голосов
/ 23 мая 2010

Хорошая идея - предоставить методы в базовом классе для реализации, такие как 'createWeapon()', а затем использовать эти методы для установки полей в конструкторе. Методы будут возвращать объект по умолчанию, если они не переопределены.

Редактировать: не делайте эти поля статичными. Нет никакого смысла. Вы можете вернуть статические версии этих объектов по умолчанию, если вы хотите поддерживать только отдельные экземпляры по умолчанию. Но ваш пример кажется более простым, например, с использованием char. В этом случае не было бы много пользы. Просто верните символ.

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