如何使用多态而不是instanceof?(为什么?)

JDe*_*age 14 java polymorphism instanceof

如果我们采用以下代码:

Shape p1 = new Square();
Square c1;
if(p1 instanceof Square) {
  c1 = (Square) p1;
}
Run Code Online (Sandbox Code Playgroud)

偏好多态性是什么意思instanceof,顺便说一下,为什么它更好?

编辑: 我理解多态是什么; 我所缺少的是如何使用它而不是instanceof.

iir*_*ekm 12

if ... else ...(或switch,或者访问者)和多态之间的主要区别是模块性.有一种所谓的开放闭合原则,它基本上意味着,当您向现有程序添加新功能时,您在现有代码中所做的更改越少越好(因为每次更改都需要一些工作,并且可能会引入错误).那么让我们比较一下变化的数量:

  • 添加一个新方法(例如你有paint()和getArea(),让我们添加getCircumference()):使用if-else解决方案你只需要改变一个文件 - 包含新方法的文件.使用多态,您必须更改Shape类的所有实现.

  • 添加一种新的Shape(你有Square,Circle - 让我们添加Triangle):使用if-else解决方案,你必须使用if-else查看所有现有的类,并为Triangle添加一个新的if分支; 使用多态性,您只需要添加一个新类并在其中实现所有必需的方法.

所以,如果......其他......或多态:它取决于模块性.如果您希望以后添加许多新子类,请使用多态; 如果您希望以后添加许多新方法,请使用if ... else ...,并在类中只放置最基本的方法,如访问器.换句话说:当你期望有很多if ... else ...分支时,你应该使用多态,当你期望很少这样的分支时,只要留下来,如果......其他......

另外:当你期望很少if ... else ...分支,但在很多地方,你应该考虑封装这个if ... else ... with Visitor模式或只是为每个分支制作一个单独的case的枚举.