2012-09-12 4 views
0

pour un petit jeu Je veux concevoir deux classes qui devraient dessiner mes unités. J'ai les classes Unit et Settler qui s'étend Unit. Pour les dessiner j'ai les classes UnitView et SettlerView.Inheritence Class Design (en Java)

Maintenant UnitView a une méthode public void draw(Graphics g) et SettlerView devrait utiliser la même méthode. La différence dans les deux classes devrait être dans la façon dont ils obtiennent l'information pour dessiner l'unité. Disons Units sont toujours bleus et Settlers ont une couleur en fonction de leur santé (ce qui serait un champ dans Settler, où SettlerView a accès à).

Quelle serait la bonne façon d'implémenter cela? Je veux un design propre sans méthodes publiques comme setColor.

edit: Ce fut ma première approche:

public class UnitView { 
    private Unit unit; 
    public Color color; // I don't want to make it public. Setting it private + getter/setter does not seem to be different to me. 
    private color calculateColor() { ...uses the information of unit... } 
    public void draw(Graphics g) { ...something using the Color... } 

} 

public class SettlerView extends UnitView { 
    private Settler settler; 

    private color calculateColor() { ...this method overides the one of UnitView.... } 
} 

Je veux utiliser Polymorphisme pour appeler UnitView.draw. L'élément clé est le domaine public Couleur.

+1

Les accesseurs et les mutateurs pour les variables membres sont la clé de l'encapsulation et font partie d'une conception propre. Vous ne devriez pas essayer de les éviter. – Borgleader

+0

Créer une interface IView contenant la méthode draw(), avoir UnitView et SettlerView implémenter IView. Partout où vous utilisez un * View, utilisez l'interface IView. Comme une interface ne peut pas avoir de champs, vous devez créer une méthode accesseur getColor() et l'ajouter à l'interface IView. – ryan0

Répondre

0

vous pouvez toujours remplacer la méthode de dessin parent.

donc par exemple si la méthode mère est

public void draw(Graphic g){ 
    g.setColor(blue); 
} 

la classe enfant aura

@Override 
public void draw(Graphic g){   
    if (this.health > 50){ 
     g.setColor(green); 
    }else{ 
     g.setColor(red); 
    } 
    super.draw(g); // if you want to call the parent draw and just change color 
} 
+0

Merci pour la réponse. Supposons que draw (Graphic g) est une fonction compliquée et que je veux utiliser l'implémentation parentclass, car seule la couleur a changé. – Elrond1337

+0

utiliser super.draw à l'intérieur de l'enfant dessiner –

+0

Mais comment sait-il à propos de la couleur changée alors? – Elrond1337