我的所有活动(ActivityBase
)都有一个基类,它本身来自android.app.Activity
。在onCreate中,我想基于当前正在执行的子类执行一些条件逻辑。如果SomeCustomActivity
和AnotherCustomActivity
都延伸ActivityBase
,我如何在父类(ActivityBase
)中确定哪两个是当前正在执行的那个?
答案 0 :(得分:61)
在某些情况下,父类中的这一行只能解决这个问题。它返回“child”类的名称(不是父类):
this.getClass().getName() //String like "com.mycompany.myclassname"
this.getClass().getSimpleName() //String like "myclassname"
请参阅此处以获取进一步的讨论:http://www.coderanch.com/t/324715/java/java/Getting-child-class-name-parent
答案 1 :(得分:16)
使用instanceof运算符。
如果要检查变量Base
是否为{{SubOne
的实例,假设您有一个基类和两个名为SubTwo
,ref
和SubOne
的子类。 1}}或SubTwo
你会说:
if(ref instanceof SubOne){
}
else if(ref instanceof SubTwo){
}
请注意:(ref instanceof Base)
将始终返回true
。
答案 2 :(得分:3)
我认为你想使用instanceof运算符,例如:
if(this instanceof SomeCustomActivity) {
// do stuff
} else if (this instanceof AnotherCustomActivity) {
// do other stuff
}
这就是它的全部内容。
答案 3 :(得分:2)
您应该为条件逻辑创建一个抽象方法,而不是使用if语句。然后让子类运行适合它的代码。
这也将使您不必在每次创建新的子类时都修改基类。
答案 4 :(得分:1)
在你的超类创建方法中,负责回答问题的条件是X类型的子类。在处理逻辑中使用此方法来决定执行哪个代码块。每个子类都可以覆盖决策方法并根据需要回答。因此,您的超类不了解子类,子类不必担心实际的处理实现。
abstract class A {
abstract boolean isItX();
void doX() { ... }
void doY() { ... }
void process() {
if (isItX()) {
doX();
} else {
doY();
}
}
}
class B extends A {
boolean isItX() {
return true;
}
}
class C extends A {
boolean isItX() {
return false;
}
}
有关详细信息,请参阅Hollywood Principle。
答案 5 :(得分:0)
您也可以使用父级的.getClass()方法,然后像这样检查
if(parent.getClass().equals(childObj.class)){
//to do ..
}
这基本上有效,因为它返回运行时对象类。 这将特别适用于抽象类 - 我最近在我的项目中尝试和测试过。