Как найти, какой класс переопределил функцию в сложной иерархии наследования? - PullRequest
0 голосов
/ 15 мая 2019

В случае сложной иерархии наследования, например, по линии,

A имеет имя функции whoOverrideMeLatest ();

A {Interface}
|
B {Interface}
|
C {abstract class} {implemented whoOverrideMeLatest()}
|
D {abstract class extending C and implementing some random 5 interfaces} {overrides whoOverrideMeLatest()}
|
E {concrete class}
|
F {concrete class}
|
G {G is abstract class which extends F and implements 10 other interfaces}
|
H {concrete class and overrides whoOverrideMeLatest()}
|
I {abstract class extending H and implementing 3 interfaces}
|
J {concrete class}

Предположим, если я создаю экземпляр J следующим образом,

A a = new J ();

Как видите, последнее переопределение функции whoOverrideMeLatest () произошло в классе "H".Поскольку на каждом уровне происходит слишком много реализации классов, абстрактных классов и интерфейсов, вы можете понять сложность и объем перегрузки методов, а также количество функций, которые несет каждый класс.Делать это вручную и выяснить это всегда сложно: (

Вопрос,

  1. Есть ли что-нибудь в Java, если в качестве входных данных указан объект и функция, и это говорит мне, какой класс переопределенпоследняя функция в иерархии.

Например,

For => A a = new J (); мне нужно получить класс "H" в качестве вывода

For => A a = new F (); мне нужно получить класс "D" в качестве вывода

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Найден лучший способ сделать это,

Found a better way to do it,

A a= new J();
Method[] methods = a.getClass().getMethods();
for(Method method : methods) {
    System.out.println(method.getDeclaringClass() + " " + method.getName());
}

method.getDeclaringClass () возвращает последнее переопределенное имя класса.

0 голосов
/ 15 мая 2019

Вы можете просто вызвать whoOverrideMeLatest для объекта A. Он вызовет функцию, которая является последней в иерархии.Это называется полиморфизмом.Конечно, вы должны реализовать whoOverrideMeLatest во всех конкретных классах, которые должны реализовывать whoOverrideMeLatest.

    class E extends D{
     whoOverrideMeLatest (){
     System.out.println("E");
    }
   } 
...