2017-01-26 16 views
1

У меня есть эти классы;класс, не наследующий от класса, который распространяется на JComponent

public class Car extends JComponent { 

} 

public class Mazda extends Car { 

} 

public class Subaru extends Car { 
} 

В моем классе автомобиля я переопределить компонент метод Paint

@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()); 
    } 
} 

Он рисует экземпляр Мазды просто отлично, но код для экземпляров Субару просто никогда не вызывается. Кажется, что subaru не наследует Jcomponent от Car? или почему не называют painComponent? Новое на Java, поэтому я, вероятно, отсутствует что-то основное

+2

Почему бы вам не переопределить 'paintComponent' в' Mazda' и 'Subaru'? –

+0

Я пробовал, но только код Mazda работал, а не в Subaru, я также пытался сделать его абстрактным в автомобиле, но не повезло. –

+0

Как и где добавляются экземпляры? –

ответ

0

Я думаю, у вас есть проблемы с дизайном, потому что, если вы хотите @Override метод из класса супер, хороший вариант сделать это в базовом классе как Mazda или Subaru, особенно, вы хотите указанное различное поведение. В абстрактном классе, например Car, вы можете @Override метод, который является общим для Mazda и Subaru, и не имеет значения с ребенком суперкласса. Так что, я думаю, что Вы можете написать эту структуру, как это:

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()); 
    } 

} 

, а затем создать класс Mazda Mazda mazda = new Mazda() и вызвать метод: mazda.paintComponent(... или использовать полиморфизм и создать e.q. Mazda вот так: Car mazda = new Mazda();

0

Класс Subaru, несомненно, унаследован от Car, но, вероятно, вообще не отображается. Есть несколько причин для этого, но, не видя кода это только гадать:

  1. Subaru не добавил к родителю, или замещено другим экземпляром (Mazda?)
  2. родителя, где она добавляется не отображается
  3. Subaru вне экрана, нет необходимости красить
  4. Subaru с нулевой размерности, ничего не рисовать
  5. ...

Примечание: использование instanceof часто указывает на недостаток в конструкции ООП: Why not use instanceof operator in OOP design?

Было бы более OO, если каждый подкласс имеет свою собственную версию paintComponent без использования instanceof вообще. Одно из преимуществ: класс Car не нуждается в изменении при добавлении новой модели автомобиля.