Oop 如何重构此代码面向对象的面试代码?
所以我在一次采访中被要求重构这段代码 有一个Oop 如何重构此代码面向对象的面试代码?,oop,Oop,所以我在一次采访中被要求重构这段代码 有一个Shape抽象类正方形,矩形,它们是形状的派生类Square和Rectangle重写Shape的area()方法。现在我该如何重构这样的代码 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)
Shape
抽象类<代码>正方形,矩形
,它们是形状
的派生类Square
和Rectangle
重写Shape
的area()
方法。现在我该如何重构这样的代码
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条件,因为可以有很多派生类,并在该对象上调用适当的方法?也许使用一个类似于PHP的示例将是一个很好的答案
switch (object) {
case Square:
// call area on square
break;
case Rectangle:
// call area of rectangle
break;
case Cube:
// call volume of cube
break;
}
也许从PHP中使用一个类似于此的示例将是一个很好的答案
switch (object) {
case Square:
// call area on square
break;
case Rectangle:
// call area of rectangle
break;
case Cube:
// call volume of cube
break;
}
啊,现在我明白了
他想听到的可能是,您可以添加另一个抽象类,例如AbstractFlatShapes
然后检查
if (object is instance of AbstractFlatShapes){
//call area
}else{
//call volume
}
我想说清楚
AbstractFlatShapes
扩展Shape
我很肯定他想听这个。想象一下有15个平面形状,如果每个形状都有,你会做?调用相同的函数。啊,现在我明白了
他想听到的可能是,您可以添加另一个抽象类,例如AbstractFlatShapes
然后检查
if (object is instance of AbstractFlatShapes){
//call area
}else{
//call volume
}
我想说清楚
AbstractFlatShapes
扩展Shape
我很肯定他想听这个。想象一下有15个平面形状,如果每个形状都有,你会做?调用相同的函数。我认为该代码更大的问题是在一个方法中处理两个不同的东西:面积和体积。因此,在代码的后面部分,它必须再次检查对象是二维形状还是三维形状,因为您很可能无法将面积和体积处理为相同的形状。shape类应该分别实现这些方法,不管它们最初是为了获得面积和体积,我认为该代码更大的问题是在一个方法中处理两个不同的事情:面积和体积。因此,在代码的后面部分,它必须再次检查对象是二维形状还是三维形状,因为您很可能无法将面积和体积处理为相同的形状。shape类应该分别实现这些方法,无论其目的是为了首先获得面积和体积立方体从何而来?它和其他类型有什么关系?你们的例子很模糊。立方体也可以从形状派生出来。覆盖区域以给出多维数据集的体积。那么“体积”是另一种方法还是它也是“面积”方法?因为这可能是多态性的一个简单例子:只需对传递的任何形状调用area()
,您就不必查看具体的实现。请评论您的期望。我会回答得更清楚些。Cube
来自哪里?它和其他类型有什么关系?你们的例子很模糊。立方体也可以从形状派生出来。覆盖区域以给出多维数据集的体积。那么“体积”是另一种方法还是它也是“面积”方法?因为这可能是多态性的一个简单例子:只需对传递的任何形状调用area()
,您就不必查看具体的实现。请评论您的期望。我会回答得更清楚一些。我原以为面试官在“转换”陈述中会有所期待,但我不知道该回答什么。我只是回答了我不知道,然后我们转到下一个问题。@user281693我的建议?面试问题在你给出的答案中永远不会是对的或错的,只要你能解释你给出的答案的逻辑,或者这是你知道如何进一步提问的关键。切换,如果其他答案几乎相同。我的意思是,我永远不会重构这样的东西,纯粹是浪费时间。我以为面试官在期待一些关于转换的陈述,但我不知道该怎么回答。我只是回答了我不知道,然后我们转到下一个问题。@user281693我的建议?面试问题在你给出的答案中永远不会是对的或错的,只要你能解释你给出的答案的逻辑,或者这是你知道如何进一步提问的关键。切换,如果其他答案几乎相同。我的意思是,我永远不会重构像这样的东西,这只是浪费时间让我等着看是否还有更多的答案,因为这是有点开放的。如果没有,我会接受你的答案。让我等着看是否还有更多的答案,因为这是有点开放的。如果不是,我会接受你的回答。