Kemet писал(а):
Модификатор же NEW позволяет создать в наследнике метод с таким же именем, но с другой сигнатурой, для этого в VMT создается новый слот. Это, по сути, и есть механизм перегрузки методов - OVERLOAD
Так это в КП не разрешено.
Ну или может сработать для случая, когда метод в базовом классе неэкспортирован (т.е. никакой перезгрузки не будет - нет такого пространства имён, где были бы доступны оба метода).
NEW введён не для перегрузки, а для предотвращения следующей ситуации, от которой нет защиты в других языках:
разработчик компонента B ввёл впервые в своём расщирении метод X,
потом разработчик компонента А (может быть, ничего и не знающий про B) ввел в базовом типе метод с таким же названием.
При совместном использовании этих двух компонентов никто не заметит, "почему поломалось".
А так сразу же будет ошибка при загрузке модулей, а далее разработчик B полезет перекомпилировать - и наткнётся на ошибку компиляции, т.к. у него X, NEW, а в базовом типе уже есть X.
Вообще, в компонентной идеологии не только перезгрузка, но и OVERRIDE не приветствуется. Вообще наследование реализации практически не используется. Только от ABSTRACT.
Где-то в архитектурной справке в ББ OVERRIDE и супервызовы отмечены как устаревающие, помнится.
Сами разработчики ББ для случая, когда есть наследование реализации и нужна модификация поведения метода, используют следующее:
Код:
PROCEDURE (a: A) Do2-, NEW, EMPTY;
PROCEDURE (a: A) Do, NEW;
BEGIN
что-то делаем свое;
a.Do2 (* даём поработать типу-расширению *)
END Do;
Тип B(A), если нужно модифицировать Do, реализует Do2.
Do2 вызывать никто не может, кроме модуля, где определён тип-хозяин A (она с -, "только для реализации").
Основное преимущество: командует парадом базовый тип. Он может дать поработать наследнику до своих действий, после или в середине. Без его ведома никто не OVERRID-ит методы.
В общем, EXTENSIBLE для процедур нигде уже не применяется (есть пара мест в ББ, которые самые древние - ещё когда он был на Обероне-2).
EXTENSIBLE для типов тоже крайне редко применяется, типы даже и с некоторыми реализованными методами обычно имеют достаточно много ABSTRACT-методов, т.е. таки получаются ABSTRACT, с частичной реализацией.