2014-01-17 2 views
2

У меня есть супер-класс, определенный как это:Как определить эти существа в подклассах?

public class Creature { 

    Terrain terrain; 

    //symbols on cards 
    boolean flyingCreature; 
    boolean magicCreature; 
    boolean canCharge; 
    boolean rangedCombat; 
    public int specialAbility = 0; 

    public Creature(Terrain startTerrain, boolean flying, boolean magic, boolean charge, boolean ranged, int special){ 
     terrain = startTerrain; 
     flyingCreature = flying; 
     magicCreature = magic; 
     canCharge = charge; 
     rangedCombat = ranged; 
     specialAbility = special; 
    } 
} 

И у меня есть подклассы, определенные следующим образом:

public class MountainCreature extends Creature{ 
    public enum Creature{ 
     GOBLINS, DWARVES, TROLL, GREATEAGLE, BROWNDRAGON, 
     MOUNTAINMEN, GIANTROC, GIANTCONDOR, CYCLOPS, GREATHAWK, 
     OGRE, BROWNKNIGHT, LITTLEROC, GIANT, MOUNTAINLION 
    } 

    public MountainCreature(int startTerrain, boolean flying, boolean magic, boolean charge, boolean ranged, int special){ 
     super(startTerrain, flying, magic, charge, ranged, special); 
    } 
} 

У меня есть 15 различных MountainCreatures (они являются те, в моем перечислении), и они каждый из них имеет вариации всех характеристик в моем конструкторе. Как я могу определить каждое из своих Существ отдельно? Разве я не должен использовать перечисление здесь?

+0

Я не уверен, чего вы хотите достичь. Вы хотите 15 различных объектов? Или 15 разных «видов» «MountainCreature», где вы можете создавать множество объектов каждого другого вида? Возможно, разместите образец кода, который будет использовать «MountainCreature», чтобы мы могли видеть, что вы пытаетесь сделать. – ajb

+0

Я бы ожидал, что использование enum в конечном итоге создаст проблемы для вас. Вы начнете использовать инструкции if или switch, чтобы делать выбор в поведении для разных типов существ. Я бы исследовал наличие различных видов существ в качестве объектов, полученных из класса Существо. Это будет простой объектно-ориентированный подход. –

+0

В любом случае, если вы определяете 'enum', не называйте его' Существо'. Теперь у вас есть имя «Существо» с двумя разными значениями, которое, вероятно, просто приведет к путанице или другим ошибкам. – ajb

ответ

1

Я бы сделал конструктор MountainCreatureprotected, поэтому он не может быть создан непосредственно, но подклассы все еще возможны в будущем.

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

public static MountainCreature createGoblin() { 
    return new MountainCreature(/* goblin-specific characteristics here */); 
} 

public static MountainCreature createDwarf() { 
    return new MountainCreature(/* dwarf-specific characteristics here */); 
} 

// And so on... 

В качестве альтернативы, вы можете сохранить перечисление и сделать фабричный метод, который принимает значение перечисления и решает, какое существо создать:

public static MountainCreature createCreature(MountainCreature.Creature type) { 
    MountainCreature creature; 
    switch(type) { 
     case GOBLINS: 
      creature = new MountainCreature(/* goblin-specific characteristics here */); 
     break; 
     case DWARVES: 
      creature = new MountainCreature(/* dwarf-specific characteristics here */); 
     break; 
     // And so on... 
    } 
    return creature; 
} 
+0

Это именно то, что Я ищу! Спасибо! – Sarah

0

Вы должны определить классы для каждого из ваших существ, если Единственное, что у них есть, - это свойства Существа.

Но если, например, гоблины и людоеды могут жить под мостом или в пещере, вы можете использовать класс HideCreature, который расширяет Существо, а затем определяет класс Гоблин, который расширяет HideCreature и еще один класс Ogre, который также расширяет HideCreature ,

Это концепция восприятия. Затем поиск общей земли объединяется.

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