我有一个类 Child
扩展了 Parent
。
Parent child = new Child();
if (child instanceof Parent){
// Do something
}
这会返回 true 还是 false,为什么?
原文由 ikbal 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个类 Child
扩展了 Parent
。
Parent child = new Child();
if (child instanceof Parent){
// Do something
}
这会返回 true 还是 false,为什么?
原文由 ikbal 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
是 的,会的。为什么不呢?
因为 child 实际上是 Parent 的一个实例。如果您只想为孩子执行操作,您应该检查
但是,您应该记住 Effective C++ 中 Scott Meyers 的以下声明:
我认为这也适用于这种情况。如果你想根据引用对象属于什么类型的类 来做 一些事情,下面的代码结构应该可以帮助你。
注意: 我还没有编译它。
编辑:一个更好的例子
您可能正在开发 绘图 应用程序。绘制任何形状的应用程序。在这种情况下,您应该有一个 抽象 类型
Shape
。出于以下目的;绘制所有形状;列出所有形状;查找形状或删除形状,您需要有一个形状 _列表_。由于列表是父类型,因此它可以存储任何形状。
Shape
接口/抽象类/虚类 应该有一个 抽象/纯虚 函数Draw()
。因此,在 DrawToDeviceLoop 中,您只需为每个形状调用Draw()
,您无需检查它是什么形状。Shape
接口可以有一个 抽象 实现AbstractShape
,它可以有形状名称或 id 作为数据成员和 GetName、Cleanup 和其他具有所有形状通用功能的函数。请记住,抽象类型 不能 被实例化,所以
Shape
本身不能被实例化,因为它也不能被绘制。编辑 2:多态性和异常处理- user1955934 问“如何检查异常类”对于异常处理,关于多态性的最佳实践是:
所以,它基本上是一样的,如果需要以不同的方式处理异常,则应该定义一个子/特定类,并且应该 捕获 特定的异常(不检查 instanceof)
了解更多关于异常处理的最佳实践。请参阅 在 Java 中处理异常的 9 个最佳实践和异常的 最佳实践 (C#)
编辑 3:我承认这条规则有一个例外
因此,我正在使用遗留代码(用 C++ 编写),该代码大部分是大约 15 年前编写的,它们总是检查子类以执行某些操作。我被要求添加一些具有相同逻辑的代码,我告诉我的经理(他也是开发人员)我不能这样做,指向这个答案,然后我们讨论并接受了这个规则的例外。在我们的案例中,这个父类自 2000 年以来只有 2 个子类,并且我们看不到在不久的将来会添加任何子类,由于核心代码增长受限,我们决定不添加子类和当前number 仅为 2,检查类型更有效,特别是当代码是这样编写的时,从那时起。
虽然这种检查的实例也不多,但父级主要实现了复杂的功能,它更多地用于共享代码然后专门化/区分它们。