该网站反对使用 if 语句来检查对象是否具有特定类型。这与if (foo == 5) 完全不同。像if (foo instanceof pickle) 这样使用ifs 是不好的。另一种方法是使用多态性来促进封装,使代码更容易调试、维护和扩展。
一般而言,反对ifs(根据条件做某件事)将一无所获。请注意这里的所有其他答案仍然如何做出决定,那么真正的区别是什么?
解释多态背后的原因:
以这种情况为例:
void draw(Shape s) {
if (s instanceof Rectangle)
//treat s as rectangle
if (s instanceof Circle)
//treat s as circle
}
如果您不必担心对象的特定类型,概括对象的处理方式,那就更好了:
void draw(Shape s) {
s.draw();
}
这会将如何绘制形状的逻辑转移到形状类本身中,因此我们现在可以将所有形状视为相同。这样,如果我们想添加一种新的形状,我们所要做的就是编写类并给它一个draw方法,而不是修改整个程序中的每个条件列表。
这个想法在今天的编程中无处不在,接口的整个概念都是关于多态性的。 (Shape 是定义特定行为的接口,允许我们处理在我们的方法中实现 Shape 接口的任何类型。)动态编程语言更进一步,允许我们将任何支持必要操作的类型传递给方法。你觉得哪个更好看? (Python风格的伪代码)
def multiply(a,b):
if (a is string and b is int):
//repeat a b times.
if (a is int and b is int):
//multiply a and b
或使用多态性:
def multiply(a,b):
return a*b
您现在可以使用支持 * 运算符的任何 2 种类型,允许您将方法用于尚未创建事件的类型。
请参阅 polymorphism 和 what is polymorhism。