web-dev-qa-db-fra.com

La classe n'est pas abstraite et ne remplace pas la méthode abstraite

J'ai donc travaillé sur des devoirs d'abstraction pour mon cours de programmation et je suis tombé dans un problème. Le but pour moi en ce moment est de pouvoir utiliser l'abstraction, puis de dessiner plus tard avec des rectangles et des ovales une ville simple, comme un bâtiment rectangulaire ou une lumière ovale sur un lampadaire.

L'erreur que je reçois lorsque je compile est: MyTestApp.Rectangle n'est pas abstrait et ne remplace pas la méthode abstraite drawEllipse (Java.awt.Graphics) dans MyTestApp.Shape. Cette erreur apparaît sur la ligne "classe Rectangle étend la forme {" juste en dessous de la classe forme.

Ma question est: qu'est-ce que je fais mal avec mon abstraction? Je joue avec les constructeurs et les méthodes draw () dans les classes Rectangle et Ellipse depuis un moment maintenant et toujours sans chance de trouver une solution.

Le code est ci-dessous:

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

Merci d'avoir lu et aidé!

16
user063

Les deux classes Rectangle et Ellipse doivent remplacer les deux méthodes abstraites.

Pour contourner cela, vous avez 3 options:

  • Ajoutez les deux méthodes
  • Rendre chaque classe qui étend la forme abstraite
  • Avoir une seule méthode qui fait la fonction des classes qui étendront Shape et remplacer cette méthode dans Rectangle et Ellipse, par exemple:

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

Et

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

Finalement

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

Et vous pouvez basculer entre eux, comme ceci:

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

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

Encore une fois, juste un exemple.

6
Breeze

Si vous essayez de tirer parti du comportement polymorphe, vous devez vous assurer que les méthodes visibles par les classes externes (qui ont besoin de polymorphisme) ont la même signature. Cela signifie qu'ils doivent avoir le même nom, le numéro et l'ordre des paramètres, ainsi que les types de paramètres.

Dans votre cas, vous feriez mieux d'avoir une méthode générique draw(), et de vous fier aux sous-classes (Rectangle, Ellipse) pour implémenter draw() méthode comme ce que vous pensiez comme "drawEllipse" et "drawRectangle".

2
Platinum Azure