В Java вы можете вызвать открытый переопределенный метод из другого класса? - PullRequest
0 голосов
/ 10 октября 2011

Обычно переопределенный метод может быть вызван с помощью 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() ????
      }
   }
}

Возможно ли это? У меня есть обходной путь, но он немного неряшливый.

Ответы [ 3 ]

3 голосов
/ 10 октября 2011

Краткий ответ, нет.

Реализация суперкласса видна только прямым подклассам. Внешние классы в любом случае не должны знать о функциональности отдельных реализаций метода; сцепление = плохо.

Вероятно, потребуется пересмотреть ваш дизайн, если это необходимо.

0 голосов
/ 10 октября 2011

Это немного очевидно, но ... обычный способ справиться с этим - извлечь тело метода базового класса в отдельный метод, чтобы его можно было вызывать напрямую.Вы можете захотеть, чтобы он был окончательным как для производительности, так и для подчеркивания того, что он не должен быть переопределен.

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();
      // ...
   }
}
0 голосов
/ 10 октября 2011

Вы не можете вызвать метод 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
        } 
    }
}
...