我有这些课程;
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新手,所以我可能遗漏了一些基本的东西
答案 0 :(得分:0)
Subaru类肯定继承自Car,但可能根本没有显示。有一些原因,但没有看到代码只是猜测:
注意:使用instanceof
通常表示OOP设计存在缺陷:
Why not use instanceof operator in OOP design?
如果每个子类都有自己的paintComponent
版本而不必使用instanceof
,那就更好了。这样做的一个优点是:如果添加新车型,则无需更改Car类。
答案 1 :(得分: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(...
或使用polimorphism并创建e.q. Mazda
是这样的:Car mazda = new Mazda();