如何重构这段代码的OOP代码?

时间:2014-05-10 02:33:47

标签: oop

所以我被要求在面试中重构这段代码

有一个Shape抽象类。 SquareRectangleShape的派生类。 SquareRectangle会覆盖area()的方法Shape。现在我如何重构这样的代码呢?

if(object is of type Square) {
    //call area on square
} else if (object is of type Rectangle) {
   //call area of rectangle
} else if(object of type Cube) {
  // call volume of cube
}...
.
.
.

问题基本上是如何避免多个if条件,因为可以有很多派生类并在该对象上调用适当的方法?

4 个答案:

答案 0 :(得分:5)

啊,现在我明白了 他想听到的可能是你可以添加另一个抽象类,比如AbstractFlatShapes

然后检查

if (object is instance of AbstractFlatShapes){
//call area
}else{
//call volume
}

让自己清楚

AbstractFlatShapes延伸Shape 我很确定他想听到这个。想象一下,有15个扁平形状,每个形状都有else if个?调用相同的功能。

答案 1 :(得分:0)

也许使用switch - 就像PHP中的这个例子 - 会是一个很好的答案吗?

switch (object) {
    case Square:
        // call area on square
        break;
    case Rectangle:
        // call area of rectangle
        break;
    case Cube:
        // call volume of cube
        break;
}

答案 2 :(得分:0)

我认为该代码的更大问题是在一种方法中处理两种不同的东西:区域和体积。因此,稍后在代码中,它必须再次检查对象是2维形状还是3维形状,因为您很可能无法处理区域和体积。形状类应该各自实现方法,无论出于什么目的,首先获得面积和体积

答案 3 :(得分:-2)

public class Program {

    public static void main(String[] args) {

        Shape a = new Rectangle(2, 4);
        Shape b = new Square(5);
        a.area();// will call this method "return this.height*this.width;"
        b.area();// will call this method "return this.width*this.width;"
    }
}

interface Shape {
    public int area();
}

class Rectangle implements Shape {


    int width;
    int height;

    @Override
    public int area() {
        return this.height * this.width;
    }

    public Rectangle(int width, int height) {
        super();
        this.width = width;
        this.height = height;
    }
}

class Square implements Shape {

    int width;

    @Override
    public int area() {
        return this.width * this.width;
    }

    public Square(int width) {
        super();
        this.width = width;

    }
}