- •Предисловие
- •Введение Эволюция разработки программного обеспечения
- •Технологии программирования
- •Основные понятия объектно-ориентированного программирования
- •Инкапсуляция
- •Свойства
- •Векторные свойства
- •Создание и уничтожение объектов
- •Конструкторы
- •Деструкторы
- •Наследование
- •Свойства
- •Конструкторы и деструкторы класса-предка
- •Полиморфизм, виртуальные и динамические методы
- •Статическое перекрытие виртуальных методов
- •Виртуальное перекрытие конструкторов и деструкторов
- •Абстрактные методы
- •Области видимости
- •Перекрытие и переопределение свойств
- •Перекрытие методов доступа к свойствам
- •Приведение объектных типов, операторы as и is
- •Агрегация
- •События
- •Процедурный тип
- •Создание события
- •Инициаторы события
- •Делегирование
- •Внутреннее устройство объекта
- •Указатели на класс
- •Виртуальные конструкторы
- •Методы класса
- •Обработка исключительных ситуаций
- •Операторы try...Except и try...Finally
- •Исключительные ситуации как объекты
- •Перегрузка методов
- •Перегрузка виртуальных методов
- •Параметры по умолчанию
- •Основы объектно-ориентированного анализа и проектирования
- •Объектно-ориентированная модель
- •Классы и объекты
- •Заключение Применение объектно-ориентированного программирования
- •Библиографический список
-
Перекрытие и переопределение свойств
Как уже было сказано, класс-потомок наследует от своего предка все поля, методы и свойства. Кроме этого он может определять новые свойства, а также перекрывать и переопределять существующие.
Определение свойства, которое не специфицирует его тип, называется перекрытием свойства. Перекрытие свойств позволяет изменить для свойства класса-потомка области видимости или спецификации. Простейшее перекрытие включает в себя только слово property, сопровождаемое именем свойства. Такая форма используется для изменения видимости свойства. Перекрытие свойства может включать директивы read, write, default; любая такая директива перекроет соответствующую директиву в предке. Видимость можно изменять только в направлении возрастания.
Пример:
Type TSomeObject1 = class private ... protected property Size: integer read FSize; property Text: string read GetText write SetText; property Color: TColor read FColor write SetColor; ... end;
TSomeObject2 = class(TSomeObject1) private ... protected property Size write SetSize; published property Text; property Color default clBlue; ... end;
При перекрытии свойства Size добавлено служебное слово write, что дает возможность модифицировать свойство. При перекрытии свойств Text и Color изменена видимость свойств с protected в published. При перекрытии свойства Color также добавлено значение по умолчанию clBlue.
Повторное объявление свойства в потомке с именем, совпадающим с именем свойства предка, при котором указывается тип свойства, называют переопределением. Это означает, что будет создано совершенно новое свойство с тем же самым именем, что и у свойства класса-предка. Любое описание свойства с указанием типа должно быть полным в отличие от случая перекрытия.
Сравним перекрытие и переопределение свойств:
Type TSomeObject1 = class private ... protected ... property SomeProperty1: integer read GetSomeProperty1; property SomeProperty2: integer read GetSomeProperty2; ... end;
TSomeObject2 = class(TSomeObject1) private ... protected property SomeProperty1 write SetSomeProperty1; property SomeProperty2: integer write SetSomeProperty2; end;
Первое свойство в этом примере перекрывается. Причем для него объявляется метод записи. Таким образом, первое свойство будет иметь и метод чтения, объявленный в предке, и метод записи. Второе свойство переопределяется. При этом для него объявляется только метод записи. И это свойство не будет иметь возможности чтения.
Перекрытие и переопределение свойств является по своей природе статическим. То есть вся работа со свойством будет происходить так, как определено в классе, соответствующем типу указателя, а не типу реально созданного объекта. Например:
interface Type TSomeOb1 = class private ... public property Value: integer read Method1 write Method2; end;
TSomeOb2 = class(TSomeOb1) private ... public //перекрытие свойства property Value read Method3 write Method4; end;
Implementation procedure Test; var MyObject: TSomeOb1; X: integer; begin MyObject := TSomeOb2.Create; ... MyObject.Value := 10; //будет вызван метод Method2
X := MyObject.Value; //будет вызван метод Method1 ... MyObject.Free; end;
В этом примере при чтении или записи свойства Value объекта MyObject будут вызваны методы Method1 и Method2, то есть те, которые определены для типа объекта TSomeOb1, а не для реального типа созданного объекта TSomeOb2.
На практике переопределение свойств используется редко. Лучше объявить новое свойство с оригинальным именем. Перекрытие свойств используется довольно часто. Чаще всего перекрытие применяется для повышения видимости свойства. Другое возможное применение перекрытия свойств – назначение свойствам значения по умолчанию, что полезно при разработке компонентов Borland Delphi.