La class non è astratta e non sovrascrive il metodo astratto

Quindi ho lavorato su un compito di astrazione per la mia class di programmazione e sono caduto in un problema. L’objective per me in questo momento è quello di poter usare l’astrazione, per poi essere in grado di disegnare con rettangoli e ovali una città semplice, come un edificio rettangular o una luce ovale su un palo luminoso.

L’errore che sto ricevendo durante la compilazione è: MyTestApp.Rectangle non è astratto e non sovrascrive il metodo astratto drawEllipse (java.awt.Graphics) in MyTestApp.Shape. Questo errore compare sulla riga “class Rectangle estende Shape {” proprio sotto la class Shape.

La mia domanda è: cosa sto sbagliando con la mia astrazione? Sono stato a disagio con i metodi costruttori e draw () nelle classi Rectangle ed Ellipse per un po ‘di tempo e ancora non ho avuto la fortuna di trovare una soluzione.

Il codice è di seguito:

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

Grazie per aver letto e aiutato!

    Entrambe le classi Rectangle ed Ellipse devono sostituire entrambi i metodi astratti.

    Per ovviare a questo, hai 3 opzioni:

    • Aggiungi i due metodi
    • Rendi ogni class che estende l’astratto di forma
    • Avere un unico metodo che faccia la funzione delle classi che estenderanno Shape e sovrascrivi quel metodo in Rectangle ed Ellipse, ad esempio:

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

    E

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

    Finalmente

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

    E puoi passare da una all’altra, in questo modo:

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

    Di nuovo, solo un esempio.

    Se stai cercando di sfruttare il comportamento polimorfico, devi assicurarti che i metodi visibili alle classi esterne (che hanno bisogno di polimorfismo) abbiano la stessa firma. Ciò significa che devono avere lo stesso nome, numero e ordine dei parametri, nonché i tipi di parametri.

    Nel tuo caso, potresti fare meglio ad avere un metodo generico draw() , e contare sulle sottoclassi ( Rectangle , Ellipse ) per implementare il metodo draw() come quello che stavi pensando come “drawEllipse” e “drawRectangle”.