gpt4 book ai didi

java - 如果是父实例,instanceof 是否返回 true?

转载 作者:IT老高 更新时间:2023-10-28 20:40:15 26 4
gpt4 key购买 nike

我有一个扩展 Parent 的类 Child

Parent child = new Child();

if (child instanceof Parent){
// Do something
}

这是返回真还是假,为什么?

最佳答案

Yes , 它会。为什么不呢?

因为 child 实际上是 Parent 的一个实例。如果您只想为 child 执行操作,则应检查

if (child instanceof Child){
}

但是,您应该记住 Scott Meyers 的 Effective C++ 中的以下陈述:

"Anytime you find yourself writingcode of the form "if the object is oftype T1, then do something, but ifit's of type T2, then do somethingelse," slap yourself.

我认为这也适用于这种情况。如果你想doSomething基于被引用对象所属的类类型,下面的代码结构应该可以帮助你。

注意:我还没有编译。

class Parent {
public void doSomething() {
System.out.println("I am the Parent, and I do as I like");
}
}

class ChildA extends Parent {
public void doSomething() {
System.out.println("I am a child named A, but I have my own ways, different from Parent");
}
}

class ChildB extends Parent {
public void doSomething() {
System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings");
}
}

public class Polymorphism101 {

public static void main(String[] args) {

Parent p = new Parent();
p.doSomething();

p = new ChildA();
p.doSomething();

p = new ChildB();
p.doSomething();

}

}

编辑:一个更好的例子

您可能正在开发一个绘图应用程序。绘制任何形状的应用程序。在这种情况下,您应该有一个 abstract 类型 Shape

出于以下目的;绘制所有形状;列出所有形状;查找形状或删除形状,您需要有一个形状的列表。由于列表是父类型,它可以存储任何形状。

Shape interface/abstract class/virtual class应该有一个abstract/pure virtual函数Draw()。因此,在您的 DrawToDeviceLoop 中,您只需为每个形状调用 Draw(),您无需检查它是什么形状。

Shape接口(interface)可以有一个abstract实现AbstractShape,它可以有shape name或id作为数据成员和GetName、Cleanup等具有所有形状通用功能的函数。

记住抽象类型不能被实例化,所以Shape本身不能被实例化,因为它也不能被绘制。

编辑 2:多态性和异常处理 - user1955934问“检查异常类怎么样”对于异常处理,关于多态性的最佳实践是:

  1. 更喜欢(抛出)特定异常 - 例如抛出 NumberFormatException 而不是 IllegalArgumentException
  2. 首先捕获最具体的异常 - 例如,如果您首先捕获 IllegalArgumentException,您将永远无法到达应该处理更具体的 NumberFormatException 的 catch block ,因为它是 IllegalArgumentException 的子类。

所以,原则上是相同的,如果需要以不同方式处理异常,则应定义子/特定类,并且应捕获特定异常(未检查 instanceof)

了解有关异常处理的更多最佳实践。见 9 Best practices to handle exception in JavaBest practices for exceptions (C#)

编辑 3:我承认这条规则有一个异常(exception)

所以,我正在使用遗留代码(用 C++ 编写),该代码大部分是在大约 15 年前编写的,它们总是检查子类以执行某些操作。我被要求添加一些具有相同逻辑的代码,我告诉我的经理(他也是开发人员)我不能这样做,指向这个答案,然后我们讨论并接受了这个规则异常(exception)。在我们的例子中,这个父类自 2000 年以来只有 2 个子类,并且我们在不久的将来看不到任何子类被添加,由于核心代码限制增长,我们决定不添加子类和当前数字只有 2,检查类型更有效,尤其是当代码是这样编写的时候。

虽然这种检查的实例并不多,但父级主要实现复杂的功能,并且更多地用于共享代码然后专门化/区分它们。

关于java - 如果是父实例,instanceof 是否返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6304056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com