繁体   English   中英

在Java中,您可以从其他类中调用公共重写的方法吗?

[英]In Java can you call a public overridden method from a different class?

通常,可以使用super调用重写的方法。 例如:

public class SuperClass {
   public void something() {
      out("called from super");
   }
}

public class SubClass extends SuperClass {
   @Override
   public void something() {
      out("called from sub");
      super.something(); // This is fine
   }

   public static void main(String[] args) {
      new SubClass().something(); // Calls both methods
   }
}

但是我想从另一个类中调用super.something()方法:

public class SubClass2 extends SuperClass {
   @Override
   public void something() {
      out("called from sub2");
      new DecidingClass().maybeCallSuperSomething(this);
   }

   public static void main(String[] args) {
      new SubClass2().something();
   }
}

public class DecidingClass {
   public void maybeCallSuperSomething(SuperClass visitor) {
      boolean keepGoing = true;
      // Do some work, maybe set keepGoing to false
      // ...
      if (keepGoing) {
         // How do I call the Overridden method?
         visitor.something() // Causes recursive loop
         // visitor.super.something() ????
      }
   }
}

这可能吗? 我有一个解决方法,但是有点草率。

简短的回答,不。

超类实现仅对直接子类可见。 无论如何,外部类都不应该知道方法的各个实现的功能; 耦合=不良。

如果有必要,可能需要重新审查您的设计。

您不能调用super方法-它是java规范的一部分,但这是一个(丑陋的)选项:

public class SuperClass {

    public void something(boolean invokeSuper) {
        // do something
    }
}

public class SubClass extends SuperClass {

    public void something(boolean invokeSuper) {
        if (invokeSuper) {
            super.something();
        } else {
            // do something
        } 
    }
}

这有点明显,但是...处理此问题的常用方法是将基类方法的主体提取到单独的方法中,以便可以直接调用它。 您可能希望它在性能上是最终的,并强调它不能被覆盖。

public class SuperClass {
   public void something() {
      doSomething();
   }
   public final void doSomething() {
      out("called from super");
   }

}

public class DecidingClass {
   public void maybeCallSuperSomething(SuperClass visitor) {
      // ...
         visitor.doSomething();
      // ...
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM