在Java中,可以从不同的类调用公共重写方法吗?

在Java中,可以从不同的类调用公共重写方法吗?,java,polymorphism,overriding,super,visitor,Java,Polymorphism,Overriding,Super,Visitor,通常,可以使用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.some

通常,可以使用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规范的一部分,但这里有一个(丑陋的)选项:


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


这有点明显,但是。。。处理这个问题的通常方法是将基类方法的主体提取到一个单独的方法中,这样就可以直接调用它。您可能希望它是最终的,既为了性能,也为了强调它不会被覆盖

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();
      // ...
   }
}

这有点明显,但是。。。处理这个问题的通常方法是将基类方法的主体提取到一个单独的方法中,这样就可以直接调用它。您可能希望它是最终的,既为了性能,也为了强调它不会被覆盖

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();
      // ...
   }
}

+1这个想法在LSP中得到了体现:很遗憾,我认为它可以快速决定是否应该调用方法。解决方法非常简单,只需要在子方法中调用super方法,即if(new decisingclass().decision(this)){super.something();}+1这个想法在LSP中得到了体现:很遗憾,我认为它可以快速决定是否应该调用一个方法。解决方法非常简单,只需要在子方法中调用super方法,即if(new decisingclass().decise(this)){super.something();}