2011-03-03 192 views
23

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

+1

问题与标题不匹配。你根本不需要儿童班的名字。而是你想测试这个'this'是否是一个特定的子类的实例。 – 2011-03-03 03:36:36

+1

超类不叫“父”吗?我听说定义为A的关系是B - B是父母,A是孩子。 – Rich 2011-03-03 03:45:58

+0

是的,超类被称为父类,但你并不特别需要知道子类的名称,你只需要知道孩子是什么类的实例。 – gailbear 2011-03-03 21:22:39

回答

15

使用instanceof运营商。

假如你有一个基类,并命名为BaseSubOneSubTwo两个子类,如果你想检查一个变量refSubOne或实例SubTwo你会说:

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

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

+1

这不是一个面向对象的解决方案。你最好使用this.getClass()。getSimpleName()。这样,每次引入新的子类时,您都不必修改父代码。或者给父母一个名为getName()的抽象方法,这样每个孩子都会返回自己的名字。 – Evvo 2017-04-24 18:40:50

3

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

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

,这是所有有给它。

2

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

这也会让你无需每次创建新的子类时修改基类。

+1

虽然我不需要重复执行任何操作。我只想知道Activity是否应该执行某段代码,否则跳过它。比方说,15和15不会。所有15个应该执行相同的代码块......应该在基类中完成,并有条件地执行它。 – Rich 2011-03-04 20:13:09

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

0

您还可以使用父母的.getClass()方法,然后检查这样

if(parent.getClass().equals(childObj.class)){ 
//to do .. 
} 

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