Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ООП.doc
Скачиваний:
23
Добавлен:
08.11.2018
Размер:
1.4 Mб
Скачать
  1. Перекрытие и переопределение свойств

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

Определение свойства, которое не специфицирует его тип, называется перекрытием свойства. Перекрытие свойств позволяет изменить для свойства класса-потомка области видимости или спецификации. Простейшее перекрытие включает в себя только слово 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.