Расширить интерфейс переопределенного метода в ABAP - PullRequest
0 голосов
/ 19 сентября 2018

Как известно, нельзя расширить или переопределить интерфейс переопределенного метода в унаследованном классе ABAP. Справка :

Интерфейс и категория метода (метод общего или функционального экземпляра или обработчик события) не изменяются в переопределении.

Это включает переопределение как глобальных, так и локальных классов.

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

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

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

Предположим, что существует метод METH интерфейса IF1, который принимает один параметр PAR1 типа TYPE1.Если вы сейчас напишите класс, который реализует метод METH с единственным параметром PAR1 типа TYPE2, то у вас не написан класс, который реализует IF1.Вызывающая сторона, которая передает параметр типа TYPE1 в метод вашего класса, столкнется с ошибкой преобразования типа (во время выполнения или во время компиляции зависит в некоторой степени от универсальности типов).

Следовательно, невозможно изменить сигнатуру метода интерфейса при его переопределении без создания таких ошибок времени выполнения - ваш класс не реализует интерфейс.Реализация интерфейса означает, что класс будет принимать именно то количество, тип и тип параметров, которые указаны для методов в интерфейсе.В буквальном смысле не существует варианта использования, в котором вы могли бы сознательно захотеть изменить это, все еще утверждая, что ваш класс реализует интерфейс.Что бы вы ни пытались сделать, это не решение проблемы.

0 голосов
/ 19 сентября 2018

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

interface
|--> extented interface
     |--> abstract class
          |--> class
...