我在理解继承如何在Java中工作时遇到了问题。我有3个相互延伸的课程。第三类是我遇到问题的棘手问题。
public abstract class Shape{
//methods and variables
protected final static int X_MAX_SIZE = 800;
protected final static int Y_MAX_SIZE = 600;
private int xCord;
private int yCord;
public void setX(int newX){
if(newX > 0 && newX < 800){
this.xCord = newX;
}
else {
System.out.println("Invalid size.");
this.xCord = 0;
}
}
public int getX(){
return xCord;
}
public void setY(int newY){
if(newY > 0 && newY < 600){
this.yCord = newY;
}
else{
System.out.println("Invalid size.");
this.yCord = 0;
}
}
public int getY(){
return yCord;
}
public Shape(){
}
public Shape(int xCord, int yCord){
}
abstract void display();
abstract double area();
}
public class Rectangle extends Shape {
// the inherited methods and calculations
int width, height;
public int getHeight(){
return height;
}
public void setHeight(int newHeight){
this.height = newHeight;
}
public int getWidth(){
return width;
}
public void setWidth(int newWidth){
this.width = newWidth;
}
public Rectangle(){
}
public Rectangle(int x, int y, int height, int width){
setX(x);
setY(y);
setHeight(height);
setWidth(width);
}
@Override
void display(){
String toScreen = "Rectangle X: " + getX() + "\nRectangle Y: " + getY();
String toScreenInfo = "\nRectangle height: " + getHeight() + "\nRectangle Width:getWidth();
String toScreenArea = "\nRectangle area: " + area();
System.out.println(toScreen + toScreenInfo + toScreenArea);
}
@Override
double area(){
return (width * height);
}
}
}
public class Square extends Rectangle {
// more methods, but no new variables. & calculations
public Square(int x, int y, int height, int width){
setX(x);
setY(y);
setHeight(height);
setWidth(width);
}
public Square(){
super();
}
@Override
public void setHeight(int height){
if(height != getWidth()){
height = getWidth();
}
}
@Override
public void setWidth(int width){
if(width != getHeight()){
width = getHeight();
}
}
@Override
double area(){
return (width * height);
}
@Override
void display(){
String toScreen = "Square area is " + area();
}
}
}
课程广场我甚至在主要电话中遇到麻烦。
所以我的目标是改变Square类的值,以确保&#39; height&#39;和#&#39;宽度&#39;为了形成正方形,它们彼此相等。限制是我无法在get / set和构造函数中创建任何新变量。
答案 0 :(得分:0)
继承应始终表示对象之间的“是一种”关系,在您的示例中也是如此。
正方形是一个矩形。 矩形是一种形状。
如果对象自然不具有“是一种”关系,那么继承可能是组织它们的一种不好的方法(基于接口的类型层次结构可能更好)。
正方形将包含矩形的成员(方法和字段)。 矩形将具有形状的成员(方法和字段)。子类可以覆盖父方法以提供更具体的行为。
如果你遇到更具体的问题,你必须给我们更多的工作。
答案 1 :(得分:0)
如果类形状中有任何抽象方法,则在Square类或Rectangle类中覆盖它们中的每一个。 如果你想创建Rectangle的对象,那么你应该只覆盖Rectangle中的所有抽象方法。
并且这里的继承是多级的而不是多次
答案 2 :(得分:0)
你想做什么是不可能做到的。事实上,这是用于演示Liskov替代原则的典型例子。 Square不能扩展Rectangle,而Rectangle也不能扩展Square。即:
class Square extends Rectangle {
...
}
public void someMethod(final Rectangle r) {
r.setHeight(300);
r.setWidth(500);
}
final Square square = new Square(200, 200);
someMethod(square);
display(square); // UHOH!!
答案 3 :(得分:-2)
问题是在Rectangle
中,您有方法setHeight
和setWidth
,它们设置实例变量height
和width
。在Square
中,您不会声明新的实例变量。因此,为了设置高度和宽度,您需要使用setHeight
中声明的setWidth
和Rectangle
方法。
但是,您不会为Square
执行此操作。 Square
类会覆盖setHeight
和setWidth
方法。对于那些设置实例变量的人,他们需要调用setHeight
中定义的setWidth
和Rectangle
方法。这样做的方法是:
super.setHeight(h); // calls the Rectangle method, which sets the variable
super.setWidth(w);
由于您不使用此功能,setHeight
中的setWidth
和Square
方法只会相互呼叫,而不是Rectangle
中的方法,结果就是height
和width
变量永远不会被设置。