【问题标题】:Class is not abstract and does not override abstract method类不是抽象的,不会覆盖抽象方法
【发布时间】:2014-06-20 13:15:03
【问题描述】:

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

我在编译时收到的错误是:MyTestApp.Rectangle 不是抽象的,并且没有覆盖 MyTestApp.Shape 中的抽象方法 drawEllipse(java.awt.Graphics)。此错误显示在 Shape 类正下方的“class 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);
            }
        }
}

感谢阅读和帮助!

【问题讨论】:

    标签: java inheritance abstract-class draw


    【解决方案1】:

    Rectangle 和 Ellipse 类都需要重写这两个抽象方法。

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

    • 添加两个方法
    • 使每个扩展 Shape 的类抽象
    • 有一个方法来执行将扩展 Shape 的类的功能,并在 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(/* ... */);
    

    再次,只是一个例子。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多