从父级获取子类名

时间:2011-03-03 03:22:34

标签: java android inheritance

我的所有活动(ActivityBase)都有一个基类,它本身来自android.app.Activity。在onCreate中,我想基于当前正在执行的子类执行一些条件逻辑。如果SomeCustomActivityAnotherCustomActivity都延伸ActivityBase,我如何在父类(ActivityBase)中确定哪两个是当前正在执行的那个?

6 个答案:

答案 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的实例,假设您有一个基类和两个名为SubTworefSubOne的子类。 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 ..
}

这基本上有效,因为它返回运行时对象类。 这将特别适用于抽象类 - 我最近在我的项目中尝试和测试过。