继承&多个类的抽象工作? 【JAVA]

时间:2014-12-07 04:28:45

标签: java inheritance abstract-class multiple-inheritance

我在理解继承如何在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和构造函数中创建任何新变量。

4 个答案:

答案 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中,您有方法setHeightsetWidth,它们设置实例变量heightwidth。在Square中,您不会声明新的实例变量。因此,为了设置高度和宽度,您需要使用setHeight中声明的setWidthRectangle方法。

但是,您不会为Square执行此操作。 Square类会覆盖setHeightsetWidth方法。对于那些设置实例变量的人,他们需要调用setHeight中定义的setWidthRectangle方法。这样做的方法是:

super.setHeight(h);   // calls the Rectangle method, which sets the variable
super.setWidth(w);    

由于您不使用此功能,setHeight中的setWidthSquare方法只会相互呼叫,而不是Rectangle中的方法,结果就是heightwidth变量永远不会被设置。