我有两个类是抽象类 A
的子类:
class X extends A {}
class Y extends A {}
我想识别传递给函数的 A
对象的子类。我可以看到两种选择:
void myfunction(A myobj) {
if(myobj instanceof X)
doXStuff((X) myobj);
if(myobj instanceof Y)
doYStuff((Y) myobj);
}
或者添加一个 enum
到 A
不同的类型:
abstract class A {
enum Type { X, Y };
Type type;
...
}
class X extends A {
type = Type.X;
...
}
class Y extends A {
type = Type.Y;
...
}
void myfunction(A myobj) {
if(myobj.type == Type.X)
doXStuff((X) myobj);
if(myobj.type == Type.Y)
doYStuff((Y) myobj);
}
哪个更好?我倾向于第二种,因为 instanceof
感觉不适合生产应用程序。还有另一种最好的方法吗?如果第二个更好,是否有更好的地方放置 enum
?
最佳答案
两者都不好。
在 A
中定义方法,覆盖 X
和 Y
中的方法,并在传入的对象上调用该方法。你是抛弃面向对象编程的基石多态性。
abstract class A {
void doStuff();
}
class Y extends A {
@Override
void doStuff() {
// Y specific implementation
}
}
class X extends A {
@Override
void doStuff() {
// X specific implementation
}
}
调用它使用
void myfunction(A myobj) {
myobj.doStuff();
}
关于java - 类型变量 vs instanceof 用于识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27715131/