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

标签 java polymorphism instanceof

如果我们采用下面的代码:

Shape p1 = new Square();
Square c1;
if(p1 instanceof Square) {
  c1 = (Square) p1;
}

相比 instanceof 更喜欢多态是什么意思,顺便说一句,为什么它更好?

编辑: 我明白什么是多态;我缺少的是如何使用它而不是 instanceof

最佳答案

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

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

  • 添加一种新的形状(您有方形、圆形 - 让我们添加三角形):使用 if-else 解决方案,您必须使用 if-else 检查所有现有类,并为三角形添加一个新的 if 分支;使用多态性,您所要做的就是添加一个新类并在其中实现所有必需的方法。

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

另外:当你期望很少的 if...else... 分支,但在很多地方时,你应该考虑使用访问者模式封装这个 if...else... 或者只是用一个单独的案例制作一个枚举对于每个分支。

关于java - 如何使用多态而不是 instanceof? (为什么?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4192837/

相关文章:

java - 线程执行期间绘制的额外虚拟组件

php - 在 PHP 中使用 call_user_function 访问父方法

java - Instanceof 和类型转换技术

java - Maven 对 zip Artifact 的依赖

用于代码格式化的java程序|技术专家实验室

java - 无法将图像插入 Excel 工作表

c++ - 在 C++ 中干净地复制基类或子类的实例?

c++ - 将其转换为基类指针是否安全?

java - 为多个 Web 服务指定模拟时,instanceof 运算符的替代方案

java - 用多个 instanceof 测试覆盖 equals() 对不同的对象是否可行?