所以我被要求在面试中重构这段代码
有一个Shape
抽象类。 Square
,Rectangle
是Shape
的派生类。 Square
和Rectangle
会覆盖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条件,因为可以有很多派生类并在该对象上调用适当的方法?
答案 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;
}
}