2014-05-04 8 views
11

तो मैं अपने प्रोग्रामिंग वर्ग के लिए अमूर्त पर एक होमवर्क पर काम कर रहा है और एक समस्या में गिर गई। मेरे लिए अभी लक्ष्य अबास्ट्रक्शन का उपयोग करने में सक्षम होना है, फिर बाद में आयताकारों और अंडाकारों को एक साधारण शहर, जैसे एक आयताकार इमारत या एक हल्के पोस्ट पर अंडाकार प्रकाश के साथ आकर्षित करने में सक्षम होना चाहिए।कक्षा सार नहीं है और सार विधि पर हावी नहीं होता

जब मैं संकलित करता हूं तो मुझे प्राप्त होने वाली त्रुटि है: MyTestApp.Rectangle सार नहीं है और MyTestApp.Shape में अमूर्त विधि drawEllipse (java.awt.Graphics) को ओवरराइड नहीं करता है। यह त्रुटि लाइन पर दिखाई देती है "कक्षा आयताकार आकार आकार के नीचे आकार {" आकार बढ़ाता है।

मेरा सवाल यह है कि मैं अपने अमूर्तता के साथ क्या गलत कर रहा हूं? मैं कंस्ट्रक्टर्स के साथ खिलवाड़ किया गया है और कोई भाग्य के लिए अब और अभी भी आकर्षित() थोड़ी देर के लिए कक्षाएं आयत और दीर्घवृत्त में तरीकों एक समाधान खोजने के लिए होता है।

कोड के नीचे है:

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

पढ़ने और मदद के लिए धन्यवाद!

उत्तर

2

दोनों वर्गों आयत और दीर्घवृत्त सार तरीकों में से दोनों को ओवरराइड करने की जरूरत है।

इस हल करने के लिए, आप 3 विकल्प हैं:

  • दो तरीकों
  • जोड़े प्रत्येक वर्ग है कि आकार सार फैली बनाओ
  • एक भी विधि है कि कक्षाओं के समारोह करता है कि आकार का विस्तार होगा, और आयत और दीर्घवृत्त में उस विधि को ओवरराइड, उदाहरण के लिए:

    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() विधि के लिए बेहतर कर सकता है, और आप के रूप में "drawEllipse" और "drawRectangle" के बारे में सोच कर दिया गया था क्या के रूप में draw() विधि को लागू करने के उपवर्गों (Rectangle, Ellipse) पर निर्भर हैं।

संबंधित मुद्दे