2017-01-26 4 views
1

J'ai ceci ces classes;classe ne héritant pas de la classe qui s'étend à JComponent

public class Car extends JComponent { 

} 

public class Mazda extends Car { 

} 

public class Subaru extends Car { 
} 

Dans ma classe de voiture-je remplacer le composant de peinture méthode

@Override 
public void paintComponent(Graphics g) { 
    //why my planets aren't painted by this method 
    if (this instanceof Mazda) { 
     g.fillOval(0, 0, this.getWidth(), this.getHeight()); 
     System.out.println(this.getClass()); 
    } 
    if (this instanceof Subaru) { 
     g.setColor(Color.blue); 
     g.fillOval(0, 0, this.getWidth(), this.getHeight()); 
     System.out.println(this.getClass()); 
    } 
} 

Il tire l'instance de mazda très bien, mais le code pour les instances de subaru juste ne sera jamais appelé. Il semble que Subaru n'hérite pas de Jcomponent de Car? ou pourquoi n'appelle pas le composant douleur? Nouveau sur Java, il me manque probablement quelque chose de basique

+2

Pourquoi ne pas surcharger 'paintComponent' dans' Mazda' et 'Subaru'? –

+0

J'ai essayé mais seul le code Mazda fonctionnait et pas chez Subaru, j'ai aussi essayé de le rendre abstrait en Car mais pas de chance. –

+0

comment et où sont les instances ajoutées? –

Répondre

0

Je pense, vous avez un problème avec la conception, parce que, si vous voulez la méthode @Override de super classe, une bonne option est faire en classe de base comme Mazda ou Subaru, surtout, vous voulez un comportement différent spécifié. Dans la classe abstraite comme Car vous pouvez @Override méthode qui est commun pour Mazda et Subaru, et n'est pas important avec l'enfant de super classe le faire. Donc, je pense que vous pouvez écrire cette structure comme ceci:

class Car extends JComponent{ 

} 

class Mazda extends Car{ 

    @Override 
    public void paintComponents(Graphics g) { 
    g.fillOval(0, 0, this.getWidth(), this.getHeight()); 
    System.out.println(this.getClass()); 
    } 
} 


class Subaru extends Car{ 

    @Override 
    public void paintComponents(Graphics g) { 
    g.setColor(Color.blue); 
    g.fillOval(0, 0, this.getWidth(), this.getHeight()); 
    System.out.println(this.getClass()); 
    } 

} 

puis créer la classe Mazda Mazda mazda = new Mazda() et appeler la méthode: mazda.paintComponent(... ou utiliser polimorphism et créer e.q. Mazda comme ceci: Car mazda = new Mazda();

0

La classe Subaru hérite sûrement de Car, mais elle n'est probablement pas affichée du tout. Il y a quelques raisons pour cela, mais sans voir le code il est juste deviner:

  1. Subaru pas ajouté au parent ou substitué par une autre instance (Mazda?)
  2. le parent où il est ajouté ne affiché
  3. Subaru hors de l'écran, pas besoin de peindre
  4. Subaru à dimension zéro, rien à peindre
  5. ...

note: l'utilisation de instanceof indique souvent un défaut dans la conception OOP: Why not use instanceof operator in OOP design?

Il serait plus OO si chaque sous-classe a sa propre version de paintComponent sans avoir à utiliser instanceof du tout. Un avantage: la classe Car n'a pas besoin d'être modifiée si vous ajoutez un nouveau modèle de voiture.