类不是抽象的,不会覆盖抽象方法

所以我一直在为编程课做抽象作业,但遇到了问题。 我现在的目标是能够使用抽象,然后能够用矩形和椭圆形绘制一个简单的城市,如矩形建筑物或灯柱上的椭圆形灯。

我编译时收到的错误是:MyTestApp.Rectangle不是抽象的,并且不会覆盖MyTestApp.Shape中的抽象方法drawEllipse(java.awt.Graphics)。 此错误显示在类Shape下方的“类Rectangle extends Shape {”行中。

我的问题是我的抽象错误是什么? 我一直在搞乱Rectangle和Ellipse类中的构造函数和draw()方法一段时间,但仍然没有找到解决方案的运气。

代码如下:

import java.awt.*; import javax.swing.*; public class MyTestApp extends JPanel { Rectangle rect; Ellipse oval; public static void main(String [] args) { MyTestApp myTestApp = new MyTestApp (); myTestApp.test(); } public MyTestApp () { //creates the jframe JFrame frame = new JFrame("MyClass Driver"); setBackground(new Color(200, 250, 200)); setPreferredSize(new Dimension(500, 400)); frame.add(this); frame.pack(); frame.setVisible(true); } public void delay(int msecs) { try { Thread.sleep(msecs); } catch (InterruptedException e) { } } public void paint(Graphics g) {//paints the rectangle and ellipse super.paint(g); if (rect != null) rect.drawRectangle(g); if (oval != null) oval.drawEllipse(g); } public void test() {//gives the x/y position, width/height, and fill/outline color for the rectangle and oval delay(1000); rect = new Rectangle(20, 30, 23, 75, Color.GREEN, Color.BLUE); oval = new Ellipse(10, 10, 10 , 34, Color.RED, Color.MAGENTA); repaint(); } public abstract class Shape{//abstract class Shape that sets the x/y, width/height, and colors for the shapes private int x, y, width, height; private Color fillColor; private Color outlineColor; public Shape(int x, int y, int width, int height, Color fillColor, Color outlineColor) { setXY(x, y); setSize(width, height); setFillColor(fillColor); setOutlineColor(outlineColor); } public boolean setXY(int x, int y) { this.x = x; this.y = y; return true; } public void setSize(int width, int height) { if (width > 0) this.width = width; if (height > 0) this.height = height; } public boolean setFillColor(Color fillColor){ if (fillColor == null) return false; this.fillColor = fillColor; return true; } public boolean setOutlineColor(Color outlineColor){ if (outlineColor == null) return false; this.outlineColor = outlineColor; return true; } public Color getFillColor() { return fillColor; } public Color getOutlineColor() { return outlineColor; } public abstract void drawRectangle(Graphics g);//do i need two? public abstract void drawEllipse(Graphics g);//do i need both? } class Rectangle extends Shape{//!!!!!!!!!! where the error shows public Rectangle(int x, int y, int width, int height, Color fillColor, Color outlineColor) { super(x, y, width, height, fillColor, outlineColor); } public void drawRectangle(Graphics g){//draws the retangle g.setColor(fillColor); g.fillRect(x, y, width, height); g.setColor(outlineColor); g.drawRect(x, y, width, height); } } class Ellipse extends Shape{ public Ellipse(int x, int y, int width, int height, Color fillColor, Color outlineColor) { super(x, y, width, height, fillColor, outlineColor); } public void drawEllipse(Graphics g){//draws the ellipse g.setColor(fillColor); g.fillOval(x, y, width, height); g.setColor(outlineColor); g.drawOval(x, y, width, height); } } } 

感谢阅读和帮助!

Rectangle和Ellipse这两个类都需要覆盖两个抽象方法。

要解决此问题,您有3个选择:

  • 添加这两种方法
  • 使每个扩展Shape的类抽象
  • 有一个方法可以执行将扩展Shape的类的function,并在Rectangle和Ellipse中覆盖该方法,例如:

     abstract class Shape { // ... void draw(Graphics g); } 

  class Rectangle extends Shape { void draw(Graphics g) { // ... } } 

最后

  class Ellipse extends Shape { void draw(Graphics g) { // ... } } 

你可以在它们之间切换,如下所示:

  Shape shape = new Ellipse(); shape.draw(/* ... */); shape = new Rectangle(); shape.draw(/* ... */); 

再一次,只是一个例子。

如果您正在尝试利用多态行为,则需要确保外部类(需要多态)可见的方法具有相同的签名。 这意味着他们需要具有相同的名称,参数的数量和顺序,以及参数类型。

在你的情况下,你可能会更好地拥有一个通用的draw()方法,并依赖子类( RectangleEllipse )来实现draw()方法,就像你一直认为的那样是“drawEllipse”和“drawRectangle”。