当前位置: 首页 > 面试题库 >

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

白光耀
2023-03-14
问题内容

如果我们采用以下代码:

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类的所有实现。

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

因此,如果…否则…或多态性:它取决于模块化。如果您希望以后会添加许多新的子类别,请使用多态性;否则,请使用。如果您希望以后会添加许多新方法,请使用if
… else …,并且在类中仅放置最“基本”的方法,例如访问器。或者换句话说:当您期望有许多if … else
…分支时,您应该使用html" target="_blank">多态性;当您期望有很少的此类分支时,请与if … else …一起使用。

另外:如果您希望if … else …分支很少,但是在很多地方,则应该考虑使用Visitor模式将if … else
…封装起来,或者只为每个分支使用单独的大小写枚举。



 类似资料:
  • 问题内容: 对于有关辅助程序/实用程序类的这些简单问题,我从未找到好的答案: 为什么我要创建一个单例(无状态)而不使用静态方法? 如果对象没有状态,为什么需要一个对象实例? 问题答案: 通常,单例用于向应用程序引入某种 全局状态 。(说实话,通常不是很必要,但这是另一个话题。) 但是,在一些极端情况下,甚至 无状态 单例也可能有用: 您希望在可预见的将来用状态扩展它。 由于某些特定的 技术 原因,

  • 很多人问了此问题,说bzero已经被posix-2008废弃,为何还使用bzero。选择bzero而不是memset,有2个原因: bzero有2个参数,指针和长度,很明确就是将制定size的内存初始化为0。而memset有3个参数,需要记忆参数的位置,有不少人经常把长度和初始化值搞错。 bzero比memset的可读性要好。memset可以制定初始化的值,实际上绝大多数情况都是0。 一旦新版本g

  • 问题内容: 我不确定为什么列出项目时为什么需要使用ul-li而不是简单地使用div。我可以使两者看起来完全一样,因此与创建div相比,创建无序列表的功能优势在哪里? 问题答案: 为了语义正确。HTML具有表达事物列表的功能,它可以帮助Google机器人,屏幕阅读器以及所有不仅仅关心网站外观的用户更好地了解您的内容。

  • 问题内容: 的OpenJDK代码包括以下行: 为什么在这里使用,而不是?我很好奇。 问题答案: 要强调的是,数字是2的幂,而不是一个完全任意的选择。因此,它警告开发人员尝试不同的数字,他们应该在模式中使用其他数字(例如或,而不是),这样他们就不会破坏依赖于两个要求的幂的方法。有评论略高于: 任何一个的容量(表长度)始终是2的幂。之所以这样设计,是因为它允许使用快速的按位AND操作()将每个键的哈希

  • 我花了很多时间来解决这个问题。我是GRAILS和GROOVY中的begginer。我有一个名为“tms\u dev”的旧oracle数据库模式。此架构有一些表(例如checktypes表)。此外,我还有由GRAILS生成的域类Checktype和ChecktypesController类-controller。 此类具有列表方法: def列表(最大整数){ } 我还配置了Datasource。gr

  • 问题内容: 我想知道为什么Arrays类的sort方法要求一个Object []类型的参数。为什么参数不是Comparable []类型。如果不传递Comparable [],它将生成ClassCastException。 为什么… public static void sort(Object [] a) 而不是 public static void sort(Comparable [] a) ?