2015-09-13 5 views
2

Это, кажется, основной вопрос. Но стоит уточнить перед интервью.Абстрактный класс не абстрактного метода invoke

У меня есть абстрактный метод в абстрактном классе. Его конкретный класс переопределил этот метод. Но я хочу вызвать исходный метод родительского класса для вызова, а не переопределенного метода. Есть ли способ сделать это?

Как я понимаю, нет способа вызвать оригинальный метод?

public abstract class Testabstract { 

    public void t1() { 
     System.out.println("parent"); 
    } 

} 


public class Testconcrete extends Testabstract { 

    public void t2() { 
     System.out.println("child11"); 
    } 

    public void t1() { 
     System.out.println("childss"); 
    } 

} 

public class Main { 

    public static void main(String[] args) { 

     Testconcrete a = new Testconcrete(); 

     a.super.t1();// compile error 
     a.t2(); 

    } 
} 

ответ

2

Нет, вы не можете напрямую ссылаться на переопределенный метод суперкласса. Это по дизайну; подкласс может добавить какое-то поведение, которое необходимо для правильности (например, сохранение какого-то кеша или другой структуры данных) или функциональных требований (например, ведение журнала). Обход функциональности подкласса поставит под угрозу правильность модели и нарушит инкапсуляцию, которая ее заверяет.

1

супер ключевое слово может использовать только с дочерним классом.

Для экс вы можете попробовать сделать

public void t2() { 
     super.t1(); 
     System.out.println("child11"); 
    } 

Кастинг для Parent также не будет работать по-прежнему ваш основной элемент Child.

Таким образом, вы не можете получить доступ из-за пределов класса Child в чистом виде. Не знаю, действительно ли это наивный способ сделать это.

+0

Спасибо. Любой другой способ без изменения существующих классов? –

0

Ваше понимание неверное. Без изменения одного из классов Testabstract или Testconcrete нет способа вызвать оригинальный метод по экземпляру Testconcrete.

Я не думаю, что это возможно даже с отражением.

Смежные вопросы