【问题标题】:Who calls my super class?谁叫我的超级班?
【发布时间】:2026-01-16 02:20:03
【问题描述】:

我有 5 个类,它们都扩展了 BaseClass。如果在我的基类中执行了一个方法,我想知道 5 个类中的哪一个在我的基类中调用了该方法。我认为我无法在我的超级调用中传递变量。这是一个 android 项目,调用是预定义的。我想我可以在我的 BaseClass 中调用类似“getCallingClass”之类的东西。

谁有想法?

【问题讨论】:

  • 你的意思是......谁调用了该方法或调用该方法的对象是什么类型?

标签: java android superclass super


【解决方案1】:

您可以通过this.getClass(); 获取调用对象的类。

你可以通过this.getClass().getName()获取类名。

或者你可以使用 instanceof 操作符来检查调用对象属于哪个类。

所以在你的基类函数中你可以简单地检查:

if(this instanceof ClassA){

}

【讨论】:

    【解决方案2】:

    超类的方法不应依赖于诸如哪个子类调用它等信息。如果您要根据调用它的子类来做某事,那么该逻辑应该在子类中,而不是在超类中。

    重写子类中的方法,显式调用超类方法,然后添加自己的子类特定逻辑。

    超类:

    public void aMethod() {
        // do superclass logic here.
    }
    

    子类:

    @Override
    public void aMethod() {
        super.aMethod();
        // Subclass-specific logic goes in the overriding method.
    }
    

    【讨论】:

      【解决方案3】:

      通常在基类中你不需要知道
      哪个子类正在执行/调用当前方法。
      如果您需要知道这一点,那么您正在做的事情不是
      完全正确,你应该想想为什么你需要知道它。

      【讨论】:

        【解决方案4】:

        您的基类的所有五个子类都继承了它们自己版本的父类方法,不包括私有方法或构造函数。如果class Fooextendsclass Bar,那么Bar中的所有非私有方法也在Foo中。

        致电this.getClass(); 将为您提供您目前所在的任何班级。如果你在 Foo 内部调用它,你会得到 Foo。如果你在 Bar 内部调用它,你会得到 Bar。如果 Foo 继承了一个存在于 Bar 中的方法,那么您仍然是该方法中的 Foo。

        【讨论】:

        • 这部分then every method in Bar is also in Foo unless it is overwritten 不适用于私有方法,我认为。此外,构造函数不是继承的。