class不继承自扩展到JComponent的类

时间:2017-01-26 06:22:42

标签: java inheritance multiple-inheritance 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());
    }
}

它很好地绘制了mazda的实例,但是subaru实例的代码永远不会被调用。似乎subaru没有从Car继承Jcomponent?或者为什么不调用painComponent? Java新手,所以我可能遗漏了一些基本的东西

2 个答案:

答案 0 :(得分:0)

Subaru类肯定继承自Car,但可能根本没有显示。有一些原因,但没有看到代码只是猜测:

  1. Subaru没有添加到父级,或者被其他实例替换(Mazda?)
  2. 未显示添加它的父级
  3. 斯巴鲁关闭屏幕,无需画画
  4. 零维度的斯巴鲁,无需画画
  5. ...
  6. 注意:使用instanceof通常表示OOP设计存在缺陷: Why not use instanceof operator in OOP design?

    如果每个子类都有自己的paintComponent版本而不必使用instanceof,那就更好了。这样做的一个优点是:如果添加新车型,则无需更改Car类。

答案 1 :(得分:0)

我认为,你有一个设计问题,因为,如果你想从超类中获得@Override方法,那么好的选择就是在MazdaSubaru,等基类中做到这一点。 ,你想指定不同的行为。在像Car这样的抽象类中,@OverrideMazda可以使用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(...或使用polimorphism并创建e.q. Mazda是这样的:Car mazda = new Mazda();