【发布时间】:2023-03-13 18:20:01
【问题描述】:
我正在写这段代码:
我们专注于三种几何形状:圆形、矩形和方形。 这些形状中的每一个都是几何形状,因此,这些几何形状可以具有包含这些形状的共同特征的父类(geometricShape)。
同时,每个几何图形都是可打印且可比较的对象,而其他对象也可以是可打印和可比较的,因此,这些几何图形将继承可打印和可比较两个接口的可打印性和可比较性。
最后,由于 Square 是 Rectangle 的一个特例,Square 将在我们的设计中从 Rectangle 扩展而来。
我的问题是让正方形只接受一个输入值(边),而它应该继承矩形的属性(接受 2 个输入值,宽度和高度)
我尝试在 Rectangle 类中使用无参数构造函数和超级构造函数,但都没有解决这个问题。
这个问题有可能与构造函数以外的其他东西有关吗?
矩形类代码:
class Rectangle extends geometricShape {
private double width, height;
private double side;
Rectangle(){
super();
}
Rectangle (double side){
this.side=side;
}
Rectangle(double width, double height) {
super.setShapeName("Rectangle");
this.width = width;
this.height = height;
}
public void setSide(double side) {
this.side = side;
}
public double getSide() {
return side;
}
@Override
public double gerPerimeter() {
return 2 * (width + height);
}
@Override
public double getArea() {
return width * height;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
}
方码:
class Square extends Rectangle {
double side;
Square(double side) {
super.setShapeName("Square");
this.side = side;
}
public double getside() {
return side;
}
public void setside(double s) {
side = s;
}
}
这是剩下的代码(没有正方形和长方形)
public class Inheritance {
public static void main(String[] args) {
int Select;
double Value1, Value2;
String s;
geometricShape Shapes[] = new geometricShape[2];
Scanner input = new Scanner(System.in);
for (int i = 0; i < 2; i++) {
s = (i < 1) ? "first " : "second ";
System.out.println("Choose the " + s + "shape type:\n" + "(1) for a circle\n" + "(2) for a rectangle\n" + "(*) for a square"); // "*" means any other number
Select = input.nextInt();
switch (Select) {
case 1:
System.out.print("Enter the radius: ");
Value1 = input.nextDouble();
Shapes[i] = new Circle(Value1);
break;
case 2:
System.out.print("Enter the width: ");
Value1 = input.nextDouble();
System.out.print("Enter the height: ");
Value2 = input.nextDouble();
Shapes[i] = new Rectangle(Value1, Value2);
break;
default:
System.out.print("Enter the side length: ");
Value1 = input.nextDouble();
Shapes[i] = new Square(Value1);
break;
}
}
System.out.println("The larger shape is:");
if (Shapes[0].isLargerThan(Shapes[1])) {
Shapes[0].print();
} else {
Shapes[1].print();
}
}
public Inheritance() {
}
}
接口可比 {
public boolean isLargerThan(E obj); // The method returns true if the self object is larger than obj }
interface Printable {
public void print();
/* For simplicity, let this method prints "A " + object name + "with area: " + shape area */ }
abstract class geometricShape implements Comparable<geometricShape>, Printable {
private String shapeName;
abstract public double gerPerimeter();
abstract public double getArea();
public String getShapeName() {
return shapeName;
}
public void setShapeName(String Name) {
shapeName = Name;
}
@Override
public boolean isLargerThan(geometricShape obj) {
return this.getArea() > obj.getArea();
}
@Override
public void print() {
System.out.println("A " + this.getShapeName()
+ " with area: " + this.getArea());
}
}
/*part 1*/
class Circle extends geometricShape {
private double radius;
Circle(double newRadius) {
super.setShapeName("Circle");
radius = newRadius;
}
@Override
public double gerPerimeter() {
return 2 * 3.14 * radius;
}
@Override
public double getArea() {
return 3.14 * radius * radius;
}
public void setradius(double r) {
radius = r;
}
public double getradius() {
return radius;
}}
【问题讨论】:
-
能否添加您的代码?
-
side 是干什么用的?
-
除了“最后,由于 Square 是 Rectangle 的特例,Square 将在我们的设计中从 Rectangle 扩展而来”的问题。是个糟糕的决定。假设您有一个需要 Rectangle 列表并需要设置它们的
width = 2; height=3的方法。但是,由于您将 Square 视为 Rectangle 的子类型,因此此类列表也可能在此处具有 square 实例。你认为,这样的正方形经过这种方法处理后应该“是什么样子”?这个结果是正确的吗? -
@RubioRic 你可能是对的,但值得记住的是来自 Bob 叔叔(SOLID 首字母缩写词的作者)的 explanation:“Square 类不是正方形,它是一个程序,表示一个正方形。Rectangle类不是一个矩形,它是一个表示一个矩形的程序。就像离婚案中的两个律师没有离婚一样,两个几何形状的代表不共享这些形状的关系”。
-
我写这篇评论是为了让大家知道我是个白痴,不知道我在写什么,因为“”代表任何其他数字,当我运行程序时,我会输入一个“”而不是一个数字,然后抱怨它是如何不起作用的。抱歉浪费你们的时间了
标签: java constructor