【问题标题】:class not inheriting from class that extends to JComponent类不继承自扩展至 JComponent 的类
【发布时间】:2017-01-26 06:22:42
【问题描述】:

我有这些课程;

public class Car extends JComponent {

}

public class Mazda extends Car {

}

public class Subaru extends Car {
}

在我的汽车类中,我重写了方法绘制组件

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

它很好地绘制了马自达的实例,但从未调用过斯巴鲁实例的代码。看来斯巴鲁没有从 Car 继承 Jcomponent?或者为什么不调用 painComponent? Java 新手,所以我可能缺少一些基本的东西

【问题讨论】:

  • 为什么不覆盖MazdaSubaru 中的paintComponent
  • 我试过了,但只有马自达代码有效,斯巴鲁没有,我也尝试在汽车中使其抽象,但没有运气。
  • 如何以及在哪里添加实例?
  • 考虑创建一个MCVE。删除额外的代码,在空框架上添加马自达和斯巴鲁,并告诉我们到底哪里出了问题。
  • 该信息不如默认语言环境请求的 minimal reproducible example 有用。

标签: java inheritance multiple-inheritance jcomponent


【解决方案1】:

我认为,你的设计有问题,因为,如果你想从超类中使用 @Override 方法,好的选择是在 MazdaSubaru, 这样的基类中进行,特别是,你想指定不同的行为。在像Car 这样的抽象类中,您可以@Override 方法对MazdaSubaru 通用,并且对于超类的孩子并不重要这样做。所以,我认为你可以这样写这个结构:

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

【讨论】:

    【解决方案2】:

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

    1. Subaru 未添加到父级,或被另一个实例替换(马自达?)
    2. 未显示添加它的父级
    3. 斯巴鲁离屏,不用画了
    4. 零维度的斯巴鲁,没有什么可画的
    5. ...

    注意:instanceof 的使用通常表明 OOP 设计存在缺陷: Why not use instanceof operator in OOP design?

    如果每个子类都有自己的paintComponent 版本,而根本不必使用instanceof,那将更加OO。这样做的一个好处是:如果添加新的汽车模型,则不需要更改 Car 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2012-09-03
      • 1970-01-01
      相关资源
      最近更新 更多