Java 从父类获取子类名称
我的所有活动都有一个基类(Java 从父类获取子类名称,java,android,inheritance,Java,Android,Inheritance,我的所有活动都有一个基类(ActivityBase),它本身派生自android.app.Activity。在onCreate中,我想基于当前执行的子类执行一些条件逻辑。如果SomeCustomActivity和AnotherCustomActivity都扩展了ActivityBase,我如何在父类(ActivityBase)中确定这两个活动中的哪一个是当前正在执行的活动?使用运算符 假设您有一个基类和两个子类,分别名为base、SubOne和SubTwo,如果要检查变量ref是否是SubOne
ActivityBase
),它本身派生自android.app.Activity
。在onCreate中,我想基于当前执行的子类执行一些条件逻辑。如果SomeCustomActivity
和AnotherCustomActivity
都扩展了ActivityBase
,我如何在父类(ActivityBase
)中确定这两个活动中的哪一个是当前正在执行的活动?使用运算符
假设您有一个基类和两个子类,分别名为base
、SubOne
和SubTwo
,如果要检查变量ref
是否是SubOne
或SubTwo
的实例,您应该说:
if(ref instanceof SubOne){
}
else if(ref instanceof SubTwo){
}
请注意:
(ref instanceof Base)
将始终返回true
。我认为您需要使用instanceof操作符,例如:
if(this instanceof SomeCustomActivity) {
// do stuff
} else if (this instanceof AnotherCustomActivity) {
// do other stuff
}
这就是它的全部。您应该为条件逻辑创建一个抽象方法,而不是使用if语句。然后让子类运行正确的代码
这还可以避免每次创建新的子类时都必须修改基类。在某些情况下,父类中的这一行就解决了这个问题。它返回“子”类的名称(不是父类):
请参阅此处以了解进一步的讨论:在负责回答问题的条件的超类创建方法中-是类型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;
}
}
有关更多信息,请参见。您也可以使用父级的.getClass()方法,然后按如下方式进行检查
if(parent.getClass().equals(childObj.class)){
//to do ..
}
这基本上是有效的,因为它返回运行时对象类。
这在抽象类的情况下尤其有效——我最近在我的项目中尝试并测试了这些抽象类。问题和标题不匹配。您根本不需要子类名称。相反,您希望测试该是否是特定子类的实例。超级类是否也被称为“父类”?我听过定义为A的关系是从B派生的-B是父类,A是子类。是的,超类被称为父类,但你不需要特别知道子类的名称,你只需要知道子类是哪个类的实例。我理解我的语义错了,但我个人确实想要这个名称。我想让我的活动以两种方式之一运行,因此我想在BaseActivity中声明一个活动列表,并说“如果当前正在执行的活动是此列表中的活动之一,请执行此代码块”。我在想,保留一份名单是最干净的解决办法。我不需要所有的活动来实现它,因为它是同一件事(可能是重复的代码)。我想我可以做一个列表或类似的东西,而不是比较名字。不过我不需要一遍又一遍地重新实现任何东西。我只是想知道这个活动是否应该执行某段代码,否则就跳过它。比如说,15个做和15个不做。所有15个都应该执行相同的代码块…应该在基类中完成,并且只是有条件地执行它。这不是一个面向对象的解决方案。最好使用这个.getClass().getSimpleName()。这样,您就不必在每次引入新的子类时修改父代码。或者给父对象一个名为getName()的抽象方法,这样每个子对象都会返回自己的名称。
if(parent.getClass().equals(childObj.class)){
//to do ..
}