我有一个基类,用于我所有活动(ActivityBase
),它本身来自android.app.Activity
。在onCreate中,我想根据当前执行的子类执行一些条件逻辑。如果SomeCustomActivity
和AnotherCustomActivity
都延伸ActivityBase
,我怎么能在父类(ActivityBase
)确定哪两个是当前正在执行的?从父类获取子类名称
回答
使用instanceof运营商。
假如你有一个基类,并命名为Base
,SubOne
和SubTwo
两个子类,如果你想检查一个变量ref
是SubOne
或实例SubTwo
你会说:
if(ref instanceof SubOne){
}
else if(ref instanceof SubTwo){
}
注意:(ref instanceof Base)
将始终返回true
。
这不是一个面向对象的解决方案。你最好使用this.getClass()。getSimpleName()。这样,每次引入新的子类时,您都不必修改父代码。或者给父母一个名为getName()的抽象方法,这样每个孩子都会返回自己的名字。 – Evvo 2017-04-24 18:40:50
我想你想使用instanceof运算符,例如:
if(this instanceof SomeCustomActivity) {
// do stuff
} else if (this instanceof AnotherCustomActivity) {
// do other stuff
}
,这是所有有给它。
而不是使用if语句,你应该为你的条件逻辑创建一个抽象方法。然后让子类运行正确的代码。
这也会让你无需每次创建新的子类时修改基类。
虽然我不需要重复执行任何操作。我只想知道Activity是否应该执行某段代码,否则跳过它。比方说,15和15不会。所有15个应该执行相同的代码块......应该在基类中完成,并有条件地执行它。 – Rich 2011-03-04 20:13:09
在某些情况下,父类中的这条线可以解决这个问题。它返回的“子”类(不是父)的名称:
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
在你的超级类负责回答问题的条件创建方法 - 是类型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。
您还可以使用父母的.getClass()方法,然后检查这样
if(parent.getClass().equals(childObj.class)){
//to do ..
}
这基本上可行的,因为它返回的运行对象类。 这将特别适用于抽象类 - 最近在我的项目中尝试和测试过。
- 1. 获取父类名称?
- 2. 如何从父类获取子类名称
- 3. Rails:获取父类方法中子类的类名称
- 4. 在父类中获取子类的函数名称
- 5. 获取超父类的方法名称层次的子类
- 6. 从父类中获取对象类名?
- 7. 如何从打字稿中的父类中获取子类的名称?
- 8. 从扩展类中获取类名称
- 9. 如何从父类获取执行的Java子类名?
- 10. 获取基于父母类名称的子元素的ID
- 11. 从子/子/继承类获取基类/父级/超级类
- 12. 从超类中获取子类的名称
- 13. C#3.5:如何从UserControl获取父类的名称?
- 14. 获取子类名?
- 15. 获取类名称函数的名称
- 16. 从datacontext获取强类型列名称
- 17. 从实例获取类的名称
- 18. 从QName获取Java类名称
- 19. C#从类的名称获取枚举
- 20. Parse.com:获取Parse.Object类名称
- 21. 获取类名称+继承
- 22. 从基类获取子类
- 23. 从子类中删除类名称
- 24. 获取类模板的类型名称
- 25. 如何获取指定类别名称中的所有子类别名称?
- 26. WordPress的 - 从术语id(ACF)获取分类名称的名称
- 27. 获取从父类别中选择的子类别
- 28. 我如何从父类别数组中获取子类别
- 29. 如何使用父类从子类获取参数?
- 30. 获取父页面名称
问题与标题不匹配。你根本不需要儿童班的名字。而是你想测试这个'this'是否是一个特定的子类的实例。 – 2011-03-03 03:36:36
超类不叫“父”吗?我听说定义为A的关系是B - B是父母,A是孩子。 – Rich 2011-03-03 03:45:58
是的,超类被称为父类,但你并不特别需要知道子类的名称,你只需要知道孩子是什么类的实例。 – gailbear 2011-03-03 21:22:39