Как вызвать супер метод (т. е. toString ()) извне производного класса

existantial вопрос

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

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 
    }
}    

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

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

5 ответов


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

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

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


Вы можете

  • добавьте метод в 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 );
    

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


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

public string getSuperString(){
    return super.toString();
}

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


в вашем коде это невозможно, если 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 ); 
    }
}