Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Pomoc s OO kódom

ahoj,

ako som vyššie napísal, definície konštánt mám v každej jednej konkrétnej (neabstraktnej) triede.

Teda napr. trieda Viper (to je jeden z typov stíhačiek) vyzerá takto:

public class Viper extends Fighter
{
        
    static final int STANDART_HULL = 12; // toto sú konštanty s ktorými má pracovať
    static final int MAX_HULL      = 15; // setter a konštruktor (pokiaľ nemá hull zadaný ako
                                         // argument)
       
    String name;    
    
    public Viper()
    {
       this.setName("Viper");
       this.setHull(STANDART_HULL);
    }
    
    public Viper(String name)
    {
       this.setName(name);
       this.setHull(STANDART_HULL);
    }
    
    public Viper(String name, int hull)
    {
       this.setName(name);
       setHull(hull);     
    }

}
Takto zatiaľ vlastne vyzerá každá konkrétna trieda, menia sa iba konštanty (malá stíhačka má menšie pancierovanie ako veľký krížnik).

Tieto konštanty používam v Setteri, využívam enkapsuláciu aby som pri zmenení premennej hull mohol overiť či nepresahuje MAX_HULL, lebo malá stíhačka rady Viper nemôže mať väčší hull ako 15.

Setter mám ale definovaný v superclasse Spaceship, keďže ho majú mať všetky lode rovnaký.

Starship:

public abstract class Spaceship
{    
    protected int hull;
    protected int MAX_HULL;      // tieto tri premenné musia byť delkarované, inak setter v tejto
    protected int STANDART_HULL; // triede veľmi protestoval :-) Sú teda nastavené na hodnotu 0.

   
    public Spaceship()                                                         
    {                                                                           
    }                                                                        
    
    public int getHull() {
        return hull;
    }

    public void setHull(int hull) { // Toto je tá metóda, setter, ktorá nefunguje správne. Podtriedy
        if (hull <= MAX_HULL)       // ju dedia a na ich inštancie ju viem vyvolať, ale argument
        this.hull = hull;           // porovnáva a nastavuje s premennou MAX_HULL z tejto triedy, teda  
       else                         // s hodnotou 0, a to aj keď sú v podtriedach na ktoré ju volám 
        this.hull = MAX_HULL;       // override-nuté.Táto metóda teda vždy v premennej podtriedy hull 
    }                            // nastaví hodnotu 0, nezávisle od toho, aký argument do nej vkladám.
    
    ........ // tu sú potom ešte všelijaké iné metódy, ktoré teraz netreba riešiť......               
}
Tomu, že supertrieda nevidí premenné a konštanty svojich podtried rozumiem. Potreboval by som preto skôr nejaký návrh, ako tento problém vyriešiť s tým, aby bol kód čo najviac objektovo-orientovaný.

(napísať getter a setter zvlášť pre každú podtriedu by bolo riešenie, ale neverím že neexistuje nič lepšie a elegantnejšie :-) )

Ďakujem pekne za rady!

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny