2012-04-13 3 views
2

Мне нужен родительский открытый абстрактный класс, который будет иметь несколько дочерних общедоступных статических классов. Мне нужен только один экземпляр класса Weapon, несколько статических классов Bow, Sword < и т. Д., Которые расширяют родительский элемент и могут существовать также только в одном экземпляре (по крайней мере, мне нужно иметь возможность получить их статические настройки). Как это сделать правильно?Как определить дочерний статический класс, который расширяет родительский абстрактный?

public abstract class Weapon { 
    ... 
} 
public static class Bow extends Weapon { 
     static String type = "Bow "; 
     static int damage = 10; 
} 

public static class Sword extends Weapon { 
     static String type = "Sword"; 
     static int damage = 10; 
} 

Получение ошибки:

Illegal modifier for the class Sword; only public, abstract & final are permitted 

Я удалил статична и она работала:

public final class Sword extends Weapon { 
     static String type = "Sword"; 
     static int hitPointsTaken = 10; 
} 

я могу скомпилировать этот System.out.println( Sword.type ); но не в этот System.out.println( Weapon.Sword.type );. Означает ли это, что я не могу получить доступ к ребенку через абстрактный реферат?

+2

И где код для класса «Меч»? –

+1

Попытавшись сделать Weapons.Sword.type, кажется, что вы думаете, что выведение класса через «extends» и вложение класса - одно и то же. Они не. Первый создает отношения «есть»; Меч - это оружие. Второй создает связь «имеет»; Оружие имеет Меч. Оператор точки позволяет вам получать доступ к полям, методам и т. Д., Если объект имеет, а не другие классы, полученные из того же класса, что и данный объект. –

ответ

3

Если вы абсолютно реализовать эту модель, вы смотрите на гнездовье:

public abstract class Weapon { 

    public static class Bow extends Weapon { 
      static String type = "Bow "; 
      static int hitPointsTaken = 10; 
    } 
} 
1

Если объект может существовать только в одном случае (то есть у меня есть только один меч в моей werehouse), это не означает, что она должна быть статический класс. Он все равно должен быть объектом. Что, если какой-нибудь космический случай ваш лучший друг кузнец даст вам бесплатно Sword tommorow? Что бы вы тогда сделали?

2

В Java только вложенные классы могут быть статическими, и это не значит, что вы так думаете. То, что вы действительно хотите делать, если что-то должно иметь только один экземпляр, это использовать шаблон Singleton: http://en.wikipedia.org/wiki/Singleton_pattern#Example

+0

Вы никогда не должны заставлять себя иметь один экземпляр объекта. Хорошо, что у вас есть один экземпляр, проходящий его, но не заставляйте его. http://programmers.stackexchange.com/questions/40373/so-singletons-are-bad-then-what –

+0

Я ненавижу одиночные одиночки, но, учитывая предмет, я не хотел спускаться в дискуссию по архитектуре с кем-то которые должны узнать немного больше об основном ООП, прежде чем причины, по которым синглеты будут плохими, даже будут иметь смысл. –

+0

Это не значит, что вы должны развращать его разум злом! Кыш! Ктулху! Кыш !!! –

1

Если вы хотите для доступа к одному экземпляру класса Bow статически, вы можете заставить класс Bow иметь непубличный конструктор и инициализировать его публичный статический экземпляр. (public static Bow THE_BOW = new Bow(...);) Это должно позаботиться о ваших статических и наследованиях. Если это не имеет смысла, дайте мне знать, и я приведу пример кода.

1

Я думаю, вам не хватает понимания статического ключевого слова. Я новичок в Java, поэтому мне пришлось искать сам. (это одна из причин, по которой я так много занимаюсь этим сайтом ... Я тоже многому научился). Я нашел this: Secrets of Static in Java with Example сайт в моих закладках, в котором подробно объясняется статическое ключевое слово. Удачи с вашим проектом.

+0

Мой ответ предполагает, что вы не намеренно хотите использовать только один экземпляр вашего класса (который является обычным использованием ключевого слова static). – cstrutton

2

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

public abstract class Weapon { 
    public abstract void usage(); 

    public static class Sword extends Test{ 

     @Override 
     public void usage() { 
      // TODO Auto-generated method stub 

     } 

    } 
} 

Один экземпляр вы можете достичь его, сделав конструктор класса оружия, как частное и есть метод деЫпзЬапсе() для создания одного экземпляра класса. Это известно как шаблон Singleton, но, пожалуйста, сделайте его singleton, если ваш дизайн действительно нуждается в другом, не стоит этого, потому что это сделает ваш код жестким для написания тестов, а также для будущих изменений.

0

Разве это не enum образец?

public enum Weapon { 
    Bow(10), 
    Sword(10); 

    private int damage; 

    Weapon (int damage) { 
    this.damage = damage; 
    } 

    public int getDamage() { 
    return damage; 
    } 
} 

Добавлено ...или более резко

public enum Weapon { 
    Bow(10) { 
    @Override 
    public void strike(Warrior warrior) { 
     // Inflict the normal damage. 
     super.strike(warrior); 
     // Sometimes also sicken. 
     if (Math.random() > .95) { 
     warrior.sicken(Illness.ArrowInTheKnee); 
     } 
    } 
    }, 
    Sword(10) { 
    @Override 
    public void strike(Warrior warrior) { 
     // Inflict the normal damage. 
     super.strike(warrior); 
     // Sometimes also sicken. 
     if (Math.random() > .75) { 
     warrior.sicken(Illness.StabInTheBack); 
     } 
    } 
    }; 

    // Normal damage inflicted. 
    private int damage; 

    Weapon(int damage) { 
    this.damage = damage; 
    } 

    public int getDamage() { 
    return damage; 
    } 

    public void strike(Warrior warrior) { 
    warrior.inflict(damage); 
    } 

    // Placeholder 
    public interface Warrior { 
    public void inflict(int damage); 
    public void terrorise(int fear); 
    public void sicken (Illness illness); 
    } 

    enum Illness { 
    StabInTheBack, 
    ArrowInTheKnee; 
    } 
} 
0

Лучший способ сделать это использовать шаблон Singleton для вашего «класса оружия».

Сделайте свой конструктор закрытым и используйте метод getInstance() для извлечения экземпляра вашего оружия. После этого создайте свои подклассы для Bow and Sword.

Смежные вопросы