Определить, является ли метод переопределенным.

 
 
 
Сообщения:350
Mam(O)n:
kalaider:
Расскажите поподробнее, если не сложно.
Я думаю самым подробным рассказом может служить пример кода. Я просто не могу придумать задачу при которой нужно идти от конечного метода. А вот наоборот, например иногда хочется узнать в родительском классе, переопределён ли какой метод у потомка, иногда очень хочется.


Идея в том, что по наличию метода с той же сигнатурой можно судить, переопределён ли метод в подклассе... Вы говорите, что иногда полезно знать, переопределён ли метод. В каких случаях, например?

У меня задача была такой: автовызов аннотированных методов (что-то вроде dependency injection, но с методами), начиная с вершины иерархии. Если в подклассе метод помечен на автовызов, метод в суперклассе не должен быть вызван (поскольку в аннотациях дополнительная конфигурация содержется, а конфигурация в подклассе переопределяет конфигурацию в суперклассе). Только проверкой со стороны суперкласса не обойдешься, т.к. bridge метод, например, аннотирован быть не может. Фактически, метод подкласса будет вызван дважды, т.к. не будет найдена аннотированная реализация, а только bridge. Проблему решил проверкой со стороны подкласса. Может есть иные решения?
 
 
Сообщения:2185
kalaider:
Вы говорите, что иногда полезно знать, переопределён ли метод. В каких случаях, например?
Я например использовал это в абстрактном суперклассе, который конструирует типичную форму и в зависимости от переопределённых методов добавляет на неё различные кнопки действий.

kalaider:
Может есть иные решения?
Если обязательным условием было бы то, что конечный метод в иерархии должен быть аннотирован, тогда перед вызовом метода достаточно проверить, что он не переопределён в потомке по вышеописанному мной алгоритму. Но если подразумевается, что аннотации должны наследоваться при переопределении метода, тогда конечно без разворачивания всей цепочки с дженериками и бриджами не обойтись.
 
 
Сообщения:350
Mam(O)n:
kalaider:
Вы говорите, что иногда полезно знать, переопределён ли метод. В каких случаях, например?
Я например использовал это в абстрактном суперклассе, который конструирует типичную форму и в зависимости от переопределённых методов добавляет на неё различные кнопки действий.


Ясно. Интересный способ, возьму на заметку.

Mam(O)n:
kalaider:
Может есть иные решения?
Если обязательным условием было бы то, что конечный метод в иерархии должен быть аннотирован, тогда перед вызовом метода достаточно проверить, что он не переопределён в потомке по вышеописанному мной алгоритму. Но если подразумевается, что аннотации должны наследоваться при переопределении метода, тогда конечно без разворачивания всей цепочки с дженериками и бриджами не обойтись.


Конечный метод, да и промежуточный какой-нибудь тоже, может быть и не аннотирован, так что иерархию поднимать придётся. Можно, конечно, добавить пару ограничений на API -- не слишком принципиально. Однако, без ограничений всё-таки приятнее, к тому же решение найдено.

Спасибо всем, и Mam(O)n'у в частности, за участие в обсуждении! Пусть оно будет и другим полезно!

PS: Я удивляюсь, что решение не было найдено методом гугления. Хотя, может у меня косяк где)
 
 
Сообщения:350
Нашлась-таки ошибка. После окончательного тестирования была получена последняя рабочая версия. Проектик с исходником, документацией и тестами плюс отчётом Pitest (мутационное и обычное покрытие) лежит на GitHub.
 
 
Сообщения:12
Cлушайте граждане, а может просто взять запустить парент метод, прошел значит перегружен, не прошел взяли эксепшион
значит не перегружен, счас писать под рукой нечем ,но так проще мне кажеться,
 
 
Сообщения:350
sergioK:
Cлушайте граждане, а может просто взять запустить парент метод, прошел значит перегружен, не прошел взяли эксепшион
значит не перегружен, счас писать под рукой нечем ,но так проще мне кажеться,


Ну а если вызов метода более одного раза критичен или нежелателен? Ваш подход, если плясать по большой иерархии, именно этим и чреват.
 
 
Сообщения:12
kalaider:
sergioK:
Cлушайте граждане, а может просто взять запустить парент метод, прошел значит перегружен, не прошел взяли эксепшион
значит не перегружен, счас писать под рукой нечем ,но так проще мне кажеться,


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


Ну тогда сравнивать параметры данного класса и родителей по всей иерархии, другого не дано,
либо менять дизайн, IMHO раз такая необходимость возникла то что-то с ним не так,

А чем вызов метода критичен мне просто интересно это же не работа с ядром,
Задача реальная?
 
 
Сообщения:350
sergioK:
А чем вызов метода критичен мне просто интересно это же не работа с ядром,
Задача реальная?


Пример. Метод, который при повторном методе сбрасывает исключение. Или при каждом вызове переводит объект в новое состояние. Или просто долго выполняется -- отправка сообщения, к примеру.
 
 
Сообщения:12
Ощушение что у вас неудачный дизайн, слишком хитро, обычным полиморфизмом можно обойтись,
или если не нравиться то статическим.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет