使用.getClass()被认为是一个糟糕的设计?

am5*_*a03 4 java oop

我目前正在实现一个函数,使用超类作为参数.

例如:

private void foo(Parent parent) {
    if(parent.getClass() == Child1.class) {
        Child1 c1 = (Child1) parent;
        System.out.println(c1.getChild1Attribute());
    }
    else if(parent.getClass() == Child2.class) {
        Child2 c2 = (Child2) parent;
        System.out.println(c1.getChild2Attribute());
    }
    else if(parent.getClass() == Parent.class) {
        System.out.println(parent.getParentAttribute());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个坏主意吗?

我在这里读到了一些线索,说使用getClass()或是instanceof不好的设计:

das*_*ght 7

它不一定是一个糟糕的设计,但它表明可能会出现问题.

您的具体情况看起来很糟糕,因为看起来单个方法可以识别多个类.这可能表示您错过了过载的可能性,或者有机会使用多个调度模式之一:

// Three overloads - one per target class
private void foo(Parent obj) {
}
private void foo(Child1 obj) {
}
private void foo(Child2 obj) {
}
Run Code Online (Sandbox Code Playgroud)

常见的多个调度模式之一是访问者模式,看它是否适用于您正在解决的问题.


SLa*_*aks 6

是的,这是糟糕的设计.

相反,您应该在超类中创建一个抽象方法,并在每个子类中覆盖它以执行所需的操作.