从父类获取子类名称

我有一个基础类,我所有的活动( ActivityBase ),它本身从android.app.Activity派生。 在onCreate我想执行一些基于当前正在执行的子类的条件逻辑。 如果SomeCustomActivityAnotherCustomActivity都扩展了ActivityBase ,我怎么能在父类( ActivityBase )中确定哪两个是当前正在执行的呢?

使用instanceof操作符。

假设你有一个基类和两个名为BaseSubOneSubTwo子类,如果你想检查一个variablesref是否是一个SubOneSubTwo的实例,你会说:

 if(ref instanceof SubOne){ } else if(ref instanceof SubTwo){ } 

请注意:( (ref instanceof Base)将始终返回true

在某些情况下,父类中的这一行解决了这个问题。 它返回“子”类(不是父类)的名称:

 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

我想你想使用instanceof运算符,例如:

 if(this instanceof SomeCustomActivity) { // do stuff } else if (this instanceof AnotherCustomActivity) { // do other stuff } 

这就是它的全部。

您应该为您的条件逻辑创build一个抽象方法,而不是使用if语句。 然后让子类运行正确的代码。

这也将使你不必每次创build一个新的子类时都要修改基类。

在你的超类创build方法中,负责回答问题的条件是子类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; } } 

有关更多信息,请参阅好莱坞原则