我有一个基类,Statement
其他几个类继承自,命名IfStatement
,WhereStatement
等...在语句中执行测试if
以确定Statement
实例派生自哪种类的最佳方法是什么?
6 回答
if(object instanceof WhereStatement) {
WhereStatement where = (WhereStatement) object;
doSomething(where);
}
请注意,这样的代码通常意味着您的基类缺少多态方法。iedoSomething()
应该是一个Statement
可能是抽象的方法,它被子类覆盖。
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
这种技术的好处(与“instanceof”关键字相反)是您可以将测试类作为对象传递。但是,是的,除此之外,它与“instanceof”相同。
注意:我故意避免对类型实例检查是否是正确的做法进行社论。是的,在大多数情况下,最好使用多态性。但这不是OP所要求的,我只是在回答他的问题。
你的问题的答案是instanceof。
但是,请记住,如果您的代码需要 instanceof,则表明您的设计有问题。在某些情况下 instanceof 是合理的,但它们是例外。通常,如果您的子类需要表现不同,则必须使用多态性而不是 if()s。
isAssignableFrom(java.lang.Class)
从课堂上是你的答案。
试试这个:
if (Statement.class.isInstance(obj)) {
doStuffWithStatements((Statement) obj));
}
因为Class.isInstance()方法将对象实例作为参数。
这不是以面向对象的方式做事的方式,它是对旧代码/数据二分法的回归。现在这不一定是坏事(如果你知道自己在做什么),但它应该留给像 C 这样的非面向对象的语言。
通过适当的设计,您不需要那种行为。而不是构造:
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
(向benjismith'窃取'他的代码道歉),你真的应该让对象本身对自己的活动负责,因此:
obj.doStuff();
然后每个不同obj
的类都有自己的定义doStuff
。这是正确的做法。