Как вызвать супер метод (то есть: toString ()) вне производного класса - PullRequest
9 голосов
/ 17 июня 2011

экзистенциальный вопрос

если у меня есть иерархия классов, например:

public class TestSuper {
    public static class A {
        @Override
        public String toString() { return "I am A"; }
    }
    public static class B extends A {
        @Override
        public String toString() { return "I am B"; }
    }
    public static void main(String[] args) {
        Object o = new B();
        System.out.println( o ); // --> I am B
        // ?????? // --> I am A 
    }
}    

Можно ли из основного метода вызвать toString из A, если экземпляр имеет тип B???

конечно, что-то вроде o.super.toString () не компилируется ...

Ответы [ 5 ]

21 голосов
/ 17 июня 2011

Вы не можете, и очень сознательно: это нарушит инкапсуляцию.

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

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

3 голосов
/ 17 июня 2011

Вы можете либо

  • Добавить метод к A или B, который вы вызываете вместо этого.

     // to A
     public String AtoString() {
         return toString();
     }
     // OR to B
     public String AtoString() {
         return super.toString();
     }
    
  • Встроить код A.toString () туда, где он «вызывается»

     // inlined A.toString()
     String ret = "I am A";
     System.out.println( ret );
    

Обе эти опции предполагают плохой дизайн в ваших классах, однако иногда у вас есть существующие классы, которые вы можете изменить только в ограниченных пределах.

3 голосов
/ 17 июня 2011

Вы можете просто добавить другой метод для вызова суперстроки.Что-то вроде:

public string getSuperString(){
    return super.toString();
}
1 голос
/ 17 июня 2011

Это невозможно, потому что toString () из A переопределяется на B (я думаю, вы имели в виду «класс B расширяет A»).

0 голосов
/ 17 июня 2011

В вашем коде это невозможно, в случае, если B расширяет A

public class TestSuper {
    public static class A {
        @Override
        public String toString() { return "I am A"; }
    }
    public static class B {
        @Override
        public String toString() { return "I am B"; }
    }
    public static void main(String[] args) {
        B b = new B();
        System.out.println( b ); // --> I am B
        A a = (A)b;
        System.out.println( a ); 
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...