【发布时间】:2016-03-30 00:25:08
【问题描述】:
计算正方形或长方形的面积。 帮助,所以我必须根据语句应用继承,覆盖,也许重载,在这里,当我尝试计算矩形的面积时,结果是 0.0 我相信这是因为我在子类中的 asignar (assign) 方法没有覆盖那个来自超类。 另外,这个程序是否有效地应用了继承和覆盖(除了我遇到的问题)?
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!");
}
}
【问题讨论】:
-
我不确定,但对我来说类层次结构看起来很奇怪: 1. 类
AreaF有什么好处? 2.在我看来Cuadrado必须继承自Rectangulo,因为正方形是矩形的边缘情况,高度和宽度都相等。 -
您的主要问题是您创建了两个对象
obj和obj2,当您要求插入基地时,您只在obj上设置它obj.asignar(b);之后您问是否当用户选择一个您从未设置过的矩形时,它是一个矩形或正方形obj2.asignar(b);,因此矩形总是为 0。 -
好吧,如果你想用Square和Rectangle来扩展AreaF,我建议把它改成一个带有函数返回区域的接口。就像现在一样,您在技术上是压倒一切的(添加可选的
@Override注释)。
标签: java inheritance overloading overriding