2014-05-04 21 views
11

Vì vậy, tôi đã làm việc trên một bài tập về nhà trừu tượng cho lớp lập trình của tôi và rơi vào một vấn đề. Mục đích của tôi bây giờ là có thể sử dụng trừu tượng, sau đó có thể vẽ bằng hình chữ nhật và hình bầu dục một thành phố đơn giản, giống như một tòa nhà hình chữ nhật hoặc một ánh sáng hình bầu dục trên một bài ánh sáng.Lớp không trừu tượng và không ghi đè phương pháp trừu tượng

Lỗi tôi nhận được khi biên dịch là: MyTestApp.Rectangle không trừu tượng và không ghi đè lên phương thức trừu tượng drawEllipse (java.awt.Graphics) trong MyTestApp.Shape. Lỗi này hiển thị trên dòng "lớp Rectangle mở rộng hình dạng {" ngay bên dưới hình dạng lớp.

Câu hỏi của tôi là những gì tôi đang làm sai với trừu tượng của tôi? Tôi đã rối tung với các hàm tạo và các phương thức draw() trong các lớp Rectangle và Ellipse trong một thời gian và vẫn không may mắn xảy ra để tìm một giải pháp.

Mã là dưới đây:

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

Cảm ơn bạn đã đọc và giúp đỡ!

Trả lời

2

Cả hai lớp Rectangle và Ellipse cần ghi đè cả hai phương thức trừu tượng.

Để làm việc xung quanh này, bạn có 3 lựa chọn:

  • Thêm hai phương pháp
  • Hãy mỗi lớp kéo dài Shape trừu tượng
  • Có một phương pháp duy nhất mà không được công hàm của lớp sẽ mở rộng Hình dạng và ghi đè phương thức đó trong Hình chữ nhật và Hình elip, ví dụ:

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

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

Cuối cùng

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

Và bạn có thể chuyển ở giữa chúng, như vậy:

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

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

Một lần nữa, chỉ là một ví dụ.

2

Nếu bạn đang cố gắng tận dụng lợi thế của hành vi đa hình, bạn cần đảm bảo rằng các phương pháp hiển thị cho các lớp bên ngoài (cần đa hình) có cùng chữ ký. Điều đó có nghĩa là họ cần phải có cùng tên, số lượng và thứ tự các tham số, cũng như các kiểu tham số.

Trong trường hợp của bạn, bạn có thể làm tốt hơn để có một draw() phương pháp chung chung, và dựa vào các lớp con (Rectangle, Ellipse) để thực hiện các phương pháp draw() như những gì bạn đã nghĩ đến việc là "drawEllipse" và "drawRectangle".

Các vấn đề liên quan