Мельница данных  (19.04.2024)
Наследование и переопределение членов класса и параметров подпрограмм

Все члены родительского класса наследуются дочерним классом следующим образом:

Поля

Все поля родительского класса доступны в дочернем классе. При создании в дочернем классе поля с тем же именем, что и в родительском классе, класс-наследник теряет возможность напрямую манипулировать полем родительского класса и получает поле с тем же именем. Можно сказать, что новое поле "закрывает" старое, но не "замещает" его.

Методы

Все методы родительского класса наследуются дочерним классом. При создании в дочернем классе метода с тем же именем, что и в родительском классе, метод переопределяется, т.е. вместо старого метода будет существовать новый. Единственный способом обратиться к старому (унаследованному) методу является использование в теле метода оператора унаследованного вызова inherited (см. раздел 5.3.14.). Переопределенный метод имеет все параметры родительского метода и может расширять список параметров, а также переопределять унаследованные параметры (создавая параметры с тем же именем и изменяя любой другой атрибут параметра по своему усмотрению). Скрипты форм задания параметров не наследуются и должны быть полностью заданы в переопределенном методе. Изображения-иконки методов наследуются и могут не переопределяться явно.

Свойства

Все свойства родительского класса доступны в дочернем классе. При создании в дочернем классе свойства с тем же именем, что и в родительском классе, класс-наследник теряет возможность напрямую манипулировать свойством родительского класса и получает свойство с тем же именем. Можно сказать, что новое свойство "закрывает" старое, но не "замещает" его. На практике часто бывает необходимо в унаследованном методе (особенно в конструкторе) скрыть часть параметров от пользователя, либо сузить область выбора значений для каких либо параметров. В этом случае необходимо переопределить параметры в унаследованном методе с новыми значениями свойства Scope ("Область видимости") или Domain ("Домен"). Это нормальная рекомендуемая практика. Необходимо понимать, что скрыв с формы элемент управления, соответствующий параметру, значение которого обязательно, необходимо предусмотреть, чтобы этот параметр получил значение до вызова унаследованного метода, либо из скрипта формы задания параметров, либо в теле самого метода.

Пример
В конструкторе класса, унаследованного от класса TObject, переопределен параметр Name, таким образом, что в свойстве "Область видимости" установлено значение "Не видимо пользователям". При этом тело метода конструктора должно выглядеть следующим образом:
1begin
2  Name := UniqueValue;                    (1)
3  inherited;                         (2)
4  // инициализация собственных полей
5end;
  
Параметр конструктора Description, унаследованный от конструктора класса TObject останется видимым и его значение будет в обязательном порядке установлено пользователем при помощи формы задания параметров. Значения параметров Parent и Master будут определены из контекста вызова или запрошены у пользователя. Параметр Name не будет отображен на форме задания параметров и в начале выполнения тела метода его значение будет пустым (nil). В связи с этим в строке (1) тела метода производится установка значения параметра Name при помощи функции UniqueValue. Если этого не сделать, то вызов унаследованного метода при помощи оператора inherited вернет ошибку, связанную с тем, что параметр Name имеет недопустимое значение.