从父类获取子类名称

48

我有一个基类用于所有活动(ActivityBase),该基类本身派生自android.app.Activity。在onCreate中,我想根据当前执行的子类执行一些条件逻辑。如果SomeCustomActivityAnotherCustomActivity都扩展了ActivityBase,那么父类(ActivityBase)如何确定当前正在执行哪个子类?


1
问题和标题不匹配。您根本不想要子类的名称。相反,您想测试this是否是特定子类的实例。 - Stephen C
1
超类不也被称为“父类”吗?我听过关系的定义是A继承自B - B是父类,A是子类。 - Rich
是的,超类被称为父类,但您不需要特别知道子类的名称,您只需要知道子类是哪个类的实例。 - gailbear
2
我很感激您指出我的语义错误,但就个人而言,我实际上想要的是名称。我想让我的活动表现出两种行为方式,因此我希望在BaseActivity中声明一系列活动,并说“如果当前执行的活动是该列表中的某个活动,则执行此代码块”。 我认为保持名称列表是最清晰的解决方案。我不需要所有的活动都实现它,因为这是相同的内容(将重复代码)。我想我可以创建一个List<Class>之类的东西,而不是比较名称。 - Rich
6个回答

109

18

使用 instanceof 操作符。

假设你有一个基类和两个子类分别命名为 BaseSubOneSubTwo,如果你想检查一个变量 ref 是不是 SubOneSubTwo 的实例,你可以这么说:

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

请注意:(ref instanceof Base) 虽然是这样,但始终会返回 true


10
这不是面向对象的解决方案。最好使用this.getClass().getSimpleName()。这样,每次引入新的子类时就不必修改父代码了。或者给父类一个叫做getName()的抽象方法,这样每个子类都会返回自己的名称。 - Evvo

3

不要使用if语句,而应该为您的条件逻辑创建一个抽象方法。 然后让子类运行适合它的代码。

这也将使您免于每次创建新子类时修改基类的麻烦。


1
我不需要一遍又一遍地重新实现任何东西。我只想找出Activity是否应该执行某个代码块,否则跳过它。例如,假设有15个“要做”和15个“不要做”。所有15个都应该执行相同的代码块...应该在基类中完成,并有条件地执行它。 - Rich

2

我认为您想要使用 instanceof 运算符,例如:

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

这就是全部内容了。

2
您可以使用父类的 .getClass() 方法,然后像这样检查:
if(parent.getClass().equals(childObj.class)){
//to do ..
}

这基本上是因为它返回运行时对象类。这在抽象类的情况下特别有效-最近我在我的项目中尝试并测试过。

0
在您的超类中创建一个方法,用于判断子类是否属于类型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;
    }
}

欲了解更多信息,请参见好莱坞原则


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接