【问题标题】:Get child class name from parent从父类获取子类名
【发布时间】:2011-07-07 18:31:47
【问题描述】:

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

【问题讨论】:

  • 问题和标题不匹配。您根本不想要子类名称。相反,您想测试 this 是否是特定子类的实例。
  • 超类不也叫“父类”吗?我听说关系定义为 A 派生于 B - B 是父级,A 是子级。
  • 是的,超类被称为父类,但你不需要具体知道子类的名称,只需要知道子类是哪个类的实例即可。跨度>
  • 我很感激我弄错了语义,但我个人实际上想要这个名字。我想让我的活动以两种方式之一运行,所以我想在 BaseActivity 中声明一个活动列表并说“如果当前正在执行的活动是这个列表中的一个,则执行这个代码块”。我在想保留名称列表将是最干净的解决方案。我不需要所有的活动来实现它,因为它是同一件事(将是重复的代码)。我想我可以制作一个 List 或类似的东西,而不是比较名称。

标签: java android inheritance


【解决方案1】:

使用instanceof 运算符。

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

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

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

【讨论】:

  • 这不是面向对象的解决方案。最好使用 this.getClass().getSimpleName()。这样您就不必在每次引入新的子类时修改父代码。或者给父母一个名为 getName() 的抽象方法,这样每个孩子都会返回自己的名字。
【解决方案2】:

我想你想使用 instanceof 操作符,例如:

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

仅此而已。

【讨论】:

    【解决方案3】:

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

    这也将使您不必在每次创建新子类时都修改基类。

    【讨论】:

    • 我不需要一遍又一遍地重新实现任何东西。我只是想知道 Activity 是否应该执行某段代码,否则跳过它。例如,假设 15 个可以,15 个不可以。所有 15 个都应该执行相同的代码块...应该在基类中完成并有条件地执行它。
    【解决方案4】:

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

    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

    【讨论】:

      【解决方案5】:

      在您的超类中,为负责回答问题的条件创建方法 - 是 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

      【讨论】:

        【解决方案6】:

        也可以使用父级的.getClass()方法,然后像这样检查

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

        这基本上是可行的,因为它返回运行时对象类。 这尤其适用于抽象类 - 我最近在我的项目中进行了尝试和测试。

        【讨论】:

          猜你喜欢
          • 2012-03-23
          • 1970-01-01
          • 2021-12-26
          • 2016-06-25
          • 2016-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多