Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何重构此代码面向对象的面试代码?_Oop - Fatal编程技术网

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我的建议?面试问题在你给出的答案中永远不会是对的或错的,只要你能解释你给出的答案的逻辑,或者这是你知道如何进一步提问的关键。切换,如果其他答案几乎相同。我的意思是,我永远不会重构像这样的东西,这只是浪费时间让我等着看是否还有更多的答案,因为这是有点开放的。如果没有,我会接受你的答案。让我等着看是否还有更多的答案,因为这是有点开放的。如果不是,我会接受你的回答。