2016-03-30 5 views
-4

正方形または長方形の面積を計算します。 ヘルプ、継承を適用​​する、オーバーライドする、おそらくステートメントに応じてオーバーロードする必要があります。ここで私は矩形の面積を計算しようとすると結果は0.0です。私はそれがサブクラス内のasignar(assign)メソッドがオーバーライドしていないためです1つはスーパークラスからのものです。 また、このプログラムは継承と上書きを効果的に適用しますか?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. "面"を持つクラス "AreaF"のメリットは何ですか? 2.私には、CuadradoはRectanguloから継承されなければならないように見えます。正方形は高さと幅が等しい長方形の辺の場合です。 –

+0

あなたの主な問題は、あなたが 'obj.asignar(b);'の 'obj'で設定したベースを挿入するように頼んだら、' obj'と 'obj2'の2つのオブジェクトを作成した後、ユーザが決して 'obj2.asignar(b); 'を設定しなかった矩形を選択したときの矩形または正方形であるため、矩形には常に0が設定されます。 –

+0

SquareとRectangleでAreaFを拡張したい場合は、その領域を返す関数を持つインターフェイスに変更することをお勧めします。今のように、あなたは技術的にオーバーライドしています(オプションの '@ Override'アノテーションを追加してください)。 –

答えて

2

私はこの作業の目的が何であるか本当にわからないんだけど、私は以下のクラス階層となるだろう:私はmain方法を簡素化

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

が、私はアイデアは明らかだと思います:

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 
} 

ので、FigureSquareRectangleオーバーライドarea()方法がからそれを継承します。

+1

OPが言及した要件と実装した設計を考えると、抽象クラス*の代わりに*インタフェース*を使用するほうが適しているとは思わないでしょうか?特に 'Figure'は実装されたメソッドを持っていない(そして/または要求している)からです。両者の違いをより明確にするために、[this link](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という1つのメソッドでインターフェースを使用しました。 と、2つのクラスのcubeクラスと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

何ですか? @OverrideはJavaではオプションです(良い方法ですが、オプションです)。あなたがそれらを定義する際の「隠蔽」と「上書き」の意味の違いは何ですか? –

+0

「Rectangle」と「Square」に同じgetArea()メソッドを使用した場合のメリットは何ですか? –