Как вызвать супер метод (т. е. 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 );
}
}