2016-03-30 159 views
-4

計算正方形或矩形的面積。 幫助,所以我必須應用繼承,覆蓋,也許重載取決於語句,在這裏,當我嘗試計算矩形的面積結果爲0.0我相信這是因爲我的asignar(分配)方法在子類不覆蓋一個來自超類。 此外,這個程序是否有效地繼承和覆蓋(除了我遇到的問題)?Java重寫問題(繼承)

import java.io.*; 

class AreaF { 
    private double lado; // side 

    public void asignar(double b) { 
     lado = b; 
    } 

    public double traerL() { 
     return lado; 
    } 
} 

class Cuadrado extends AreaF { 
    public double area() { 
     double a; 
     a = Math.pow(traerL(), 2); 
     return a; 
    } 
} 

class Rectangulo extends AreaF { 
    private double altura; // height 

    public void asignar(double h) { 
     double altura = h; 
    } 

    public double area() { 
     double a; 
     a = traerL() * altura; 
     return a; 
    } 
} 

public class Pro2 { 
    public static void main(String[] args) throws IOException { 
     double b = 0, h = 0; 
     int op; 
     Cuadrado obj = new Cuadrado(); // square 
     Rectangulo obj2 = new Rectangulo(); // rectangle 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     System.out.println("Ingrese la base: "); 
     try { 
      b = Double.parseDouble(br.readLine()); 
     } catch (NumberFormatException x) { 
      System.out.println(x); 
     } 
     obj.asignar(b); 
     /** 
     * 1 - for square 
     * 2 - for rectangle 
     */ 
     System.out.println("Ingrese 1 para saber el area de CUADRADO, 2 para RECTANGULO"); 

     op = Integer.parseInt(br.readLine()); 
     if (op == 1) { 
      System.out.println("El area del cuadrado es: " + obj.area()); // sq 
                      // area 
     } else if (op == 2) { 
      System.out.println("Ingrese la altura del rectangulo: "); // height 
      try { 
       h = Double.parseDouble(br.readLine()); 
      } catch (NumberFormatException x) { 
       System.out.println(x); 
      } 
      obj2.asignar(h); 
      System.out.println("El area del rectangulo es: " + obj2.area()); // rct 
                       // area 
     } else 
      System.out.println("Error!"); 
    } 
} 
+0

我不確定,但對我來說,類層次結構看起來很奇怪: 1.具有「side」的AreaF類有什麼好處? 2.對於我來說'Cuadrado'必須從'Rectangulo'繼承,因爲正方形是矩形的邊緣情況,其高度和寬度都相等。 –

+0

您的主要問題是,當您要求插入基座時,您創建了兩個對象'obj'和'obj2',您只需在'obj'這裏設置'obj.asignar(b);'然後您問是否它是一個矩形或方形,當用戶選擇了一個你從未設置過的矩形'obj2.asignar(b);'因此你將永遠有一個矩形爲0。 –

+0

好吧,如果你想用Square和Rectangle來擴展AreaF,我會建議把它改成帶有函數的接口來返回這個區域。現在,您在技術上覆蓋(添加可選的'@ Override'註釋)。 –

回答

2

我真的不知道這是什麼任務的目標,但我會與下面的類層次結構中去:

interface Figure { // also abstract class can be used there 
    abstract double area(); 
} 

class Rectangle implements Figure { 
    private double width; 
    private double height; 

    Rectangle(double width, double height) { 
     this.width = width; 
     this.height = height; 
    } 

    double area() { 
     return width * height; 
    } 
} 

class Square extends Rectangle { 
    public Square(double side) { 
     super(side, side); 
    } 
} 

我簡化main的方法,但我認爲這個想法很明確:

public static void main(String[] args) { 
    final Rectangle rectangle = new Rectangle(3, 5); 
    System.out.println("rectangle.area() = " + rectangle.area()); // result is 15.0 
    final Square square = new Square(3); 
    System.out.println("square.area() = " + square.area()); // result is 9.0 
} 

所以,Rectangle覆蓋area()Figure方法和Square繼承了它從Rectangle

+1

鑑於OP提到的要求和您已經實現的設計,您不認爲使用*接口*更適合,而不是*抽象類*?特別是因爲'圖'沒有(和/或需要)任何實現的方法。爲了更清楚地瞭解這兩者之間的區別,[這個鏈接](http://stackoverflow.com/questions/761194/interface-vs-abstract-class-general-oo)。 –

+0

我同意。其實我的第一個想法是將它創建爲一個接口(我肯定會在生產代碼中做),但後來我改變了主意。我認爲也許抽象類繼承的想法會更清楚的主題啓動。但是,如果至少我們兩個認爲界面在這裏更好,我編輯了我的文章:) –

+0

是的,我想到了很多。好的設計和答案,無論哪種方式。 :) –

0

你的代碼有很多問題。 1)縮進 2)英文名稱。 3)你有一個邏輯錯誤。 Object1.lado = a,Object1.altura = 0;而Object2.lado = 0,Object2.altura = h ==> obj2.area = 0 ...(這是你的錯誤!)。

這裏是一個很好的代碼。看看它,如果你有任何引用可以隨意問。

import java.io.*; 

class AreaF { 
    private final double lado; 

    public void asignarLado(double b) { //give mingfullnames (better in english!) 
     lado = b; 
    } 

    public double traerL() { 
     return lado; 
    } 
} 

class Cuadrado extends AreaF { 
    public double areaCuadrado() { 
     double a; 
     a = Math.pow(traerL(), 2); 
     return a; 
    } 
} 

class Rectangulo extends Cuadrado { 
    private double altura; 

    public void asignarAltura(double h) { 
     double altura = h; 
    } 

    public double areaRectangulo() { 
     double a; 
     a = traerL() * altura; 
     return a; 
    } 
} 



public class Pro2 { 
    public static void main(String[] args) throws IOException { 
     double b = 0, h = 0; 
     int op; 
     Cuadrado obj = new Cuadrado(); // square 

     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

     try { 
      System.out.println("Ingrese la base: "); 
      b = Double.parseDouble(br.readLine()); 
      obj.asignarBase(b); 

      System.out.println("Ingrese la altura del rectangulo: "); // height 
      h = Double.parseDouble(br.readLine()); 
      obj.asignarAltura(h); 

      System.out.println("Ingrese 1 para saber el area de CUADRADO, 2 para RECTANGULO"); 
      op = Integer.parseInt(br.readLine()); 

      if (op == 1) { 
       System.out.println("El area del cuadrado es: " + obj.areaCuadrado()); 
      else if (op == 2) { 
       System.out.println("El area del rectangulo es: " + obj.areaRectangulo()); 
      } 
      else 
       System.out.println("Error!"); 
      } 
     } catch (NumberFormatException x) { 
      System.out.println("Wrong arguments!"); 
     }finally{ 
      br.close; //allways close input resurce! 
     } 

    } 
} 

/// ---------------------------------------- --- 這是真正的面向對象設計。 我用一個稱爲Area的方法使用了一個接口。 和兩個類多維數據集和rect類。這是真正的路要走。

public interface Area{ 
    public double getArea(); 
} 

class Cuadrado implements Area { 
    double base; 

    public Cuadrado(double base){ 
     setBase(base); 
    } 

    public void setBase(double base) { 
     this.base = base; 
    } 

    @Override 
    public double getArea() { 
     // TODO Auto-generated method stub 
     return base*base; 
    } 


} 

class Rectangulo extends Cuadrado { 

    private double hight; 

    public Rectangulo(double base,double hight){ 
     super(base); 
     this.hight = hight; 
    } 

    public void setParams(double base,double hight) { 
     this.base = base; 
     this.hight = hight; 
    } 

    @Override 
    public double getArea() { 
     // TODO Auto-generated method stub 
     return base*hight; 
    } 
} 


public class Main { 
    public static void main(String[] args) throws IOException { 

     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

     try { 
      System.out.println("Ingrese la base: "); 
      double b = Double.parseDouble(br.readLine()); 

      System.out.println("Ingrese la altura del rectangulo: "); // height 
      double h = Double.parseDouble(br.readLine()); 

      System.out.println("Ingrese 1 para saber el area de CUADRADO, 2 para RECTANGULO"); 
      int op = Integer.parseInt(br.readLine()); 

      if (op == 1) { 
       Area cuadrado = new Cuadrado(b); // square 
       System.out.println("El area del cuadrado es: " + cuadrado.getArea()); 
      } 
      else if (op == 2) { 
       Area rectangulo = new Rectangulo(b,h); 
       System.out.println("El area del rectangulo es: " + rectangulo.getArea()); 
      } 
      else{ 
       System.out.println("Error!"); 
      } 
     } catch (NumberFormatException x) { 
      System.out.println("Wrong arguments!"); 
     }finally{ 
      br.close(); //allways close input resurce! 
     } 

    } 
} 
+4

作爲答案,這是相當低質量;應該是一個評論。 –

+0

如果你會給我-1個X10多次我永遠無法添加評論... – Alex

+0

首先,我沒有給出'-1'。我選擇了通知你。其次,這只是**而不是**作爲回答的理由。 –

1

您既不重載也不重寫。你只是躲藏起來。

重載是指在類中添加一個方法,其中名稱相同但署名不同的方法已經存在。

覆蓋是指在其超類包含具有相同名稱和簽名的方法的類中添加標記爲@Override屬性的方法。

隱藏類似於覆蓋,但添加的方法未標記爲@Override,這是您在此處完成的操作。

所以,這個問題的答案

本計劃有效地應用繼承並重寫(除了這個問題我有)?

我認爲你應該改變你的整個設計。

注:以下全部是我個人的意見。

AreaF應該是一個抽象類,甚至是一個接口。我認爲一個接口更合適,但看起來你的任務需要你使用繼承。因此,讓我們將它更改爲一個抽象類:

public abstract class AreaF { 
    public abstract double getArea(); 
} 

我看到你有一個正方形和矩形作爲基類的AreaF。讓我們來實現他們還有:

public class Square extends AreaF { 
    private double length; 
    public double getLength() { return length; } 
    public void setLength(double length) { this.length = length; } 
    @Override // I overrode the getArea method in the super class 
    public double getArea() { 
     return getLength() * getLength(); 
    } 
} 

這裏是Rectangle類:

public class Rectangle extends AreaF { 
    private double width, height; 

    // public getters and setters for width and height. You know what I mean. 
    @Override 
    public double getArea() { 
     return getWidth() * getHeight(); 
    } 
} 

然後你就可以相應地使用的方法和得到正確的結果。

+0

什麼?在Java中@Override是可選的(良好的做法,但可選)。定義它們時,「隱藏」和「覆蓋」之間的語義區別是什麼? –

+0

如果他們確實做了同樣的事情,對'Rectangle'和'Square'使用不同的'getArea()'方法有什麼好處? –