Чтение онлайн

на главную

Жанры

Технологии программирования

Костерин В В

Шрифт:

AnObject.AProperty:=…;

…:= AnObject.Aproperty;

и компилятор оттранслирует эти операторы в вызовы методов.

Рассмотрим три оператора, вписанные в текст "пустой" процедуры (метод) Button1Click:

AnObject:= TAnObject.Create;

AnObject.AProperty:= 'Привет!';

Label1.Caption:= AnObject.AProperty;

Первый оператор создает экземпляр объекта. Второй оператор в недоступное по интерфейсу (protected) поле Fvalue засылает при помощи недоступной по интерфейсу (protected) процедуры AnObject.SetAProperty текст "Привет!". Третий оператор при помощи недоступной по интерфейсу (protected)

процедуры АпОЬject.GetAProperty считывает данные из недоступного по интерфейсу поля Fvalue и засылает их в свойство Caption объекта надписи Label1.

Само свойство AProperty описано как общедоступное по интерфейсу (public), т. е. внешне свойство выглядит в точности, как доступ к обычному полю, но за всяким обращением к свойству могут стоять нужные программисту действия. Например, если у нас есть объект, представляющий собой квадрат на экране, и мы его свойству "цвет" присваиваем значение "белый", то произойдет немедленная перерисовка, приводящая реальный цвет на экране в соответствие значению свойства.

В методах, входящих в состав свойств, может осуществляться проверка устанавливаемой величины на попадание в допустимый диапазон значений и вызов других процедур, зависящих от вносимых изменений. Если же потребности в специальных процедурах чтения и/или записи нет, то возможно вместо имен методов применять имена полей.

Рассмотрим следующую конструкцию:

type

TPropObject = class(TObject)

FValue: TSomeType;

procedure DoSomething;

procedure Correct(AValue: Integer);

procedure SetValue(NewValue: Integer);

procedure AValue: Integer read Fvalue

write SetValue;

end;

procedure TPropObject.SetValue(NewValue: Integer);

begin

if (NewValue <> FValue) and Correct (NewValue)

then

FValue:= NewValue; {Засылка значения в поле}

DoSomething;

end;

В этом примере чтение значения свойства AValue означает просто чтение поля FValue. Зато при присвоении ему значения внутри метода SetValue вызывается сразу два метода.

Если свойство должно только читаться или только записываться, то в его описании может присутствовать только соответствующий метод:

type

TAnObject = class(TObject)

property AProperty: TSomeType read GetValue;

end;

В этом примере вне объекта значение свойства можно лишь прочитать. Попытка присвоить значение Aproperty вызовет ошибку компиляции.

5. ОБЪЕКТЫ И ИХ ЖИЗНЕННЫЙ ЦИКЛ

Как создаются и уничтожаются объекты? В Object Pascal экземпляры объектов могут быть только динамическими! Это означает, что в приведенном в начале раздела фрагменте переменная AMyObject хотя и выглядит как статическая переменная языка Pascal, на самом деле является указателем, содержащим адрес объекта. Любая переменная объектного типа и есть указатель (указатель — переменная, содержащая значение адреса оперативной памяти).

Память под конкретные объекты (динамические экземпляры классов) выделяется диспетчером памяти

в периоде выполнения программы в особой heap– области, где должно еще быть свободное место для размещения новых объектов. Heap — "куча мусора". Диспетчер памяти может как размещать в heap– области новые объекты, так и удалять уже ненужные, освобождая память под все новые объекты. Как раз при размещении объекта в памяти инициализируется значение переменной объектного типа адресом объекта. При удалении объекта переменная объектного типа инициализируется значением nil (пустой указатель) — нет объекта в памяти. При размещении нового объекта в памяти может оказаться, что общая свободная память имеет большой объем, но любой из освободившихся участков памяти, занимаемых уже удаленными объектами, оказывается меньше объема нового большого объекта. Для избежания такой ситуации при использовании объектных программ устанавливают в ЭВМ оперативную память заведомо большого объема. Новый экземпляр объекта создается особым методом — конструктором, а уничтожается специальным методом — деструктором:

AMyObject:= TMyObject.Create; {действия с созданным объектом}

AMyObject.Destroy; {уничтожение объекта}

В Object Pascal конструкторов у класса может быть несколько. Общепринято называть конструктор Create. Типичное название деструктора — Destroy. Рекомендуется использовать для уничтожения экземпляра объекта метод Free, который первоначально проверяет указатель (не равен ли он nil) и затем уж вызывают Destroy.

Для того чтобы правильно проинициализировать в создаваемом объекте поля, относящиеся к классу-предку, нужно сразу же при входе в конструктор вызвать конструктор предка:

constructor TmyObject.Create;

begin

inherited Create;

end;

Метод Create объекта MyObject типа TMyObject унаследован от класса предка TObject.

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

Кто создает и уничтожает формы? Это делает приложение (глобальный объект с именем Application). В файле проекта (.DPR) можно увидеть вызов функции CreateForm, предназначенный для этой цели. Что же касается объектов, создаваемых динамически (во время выполнения приложения), то здесь нужен явный вызов конструктора.

6. НАСЛЕДОВАНИЕ

Вторым "столпом" ООП, помимо инкапсуляции, является наследование. Этот простой принцип означает, что если нужно создать новый класс, лишь немного отличающийся от старого, то совершенно нет необходимости в переписывании заново уже существующих полей и методов. Новый класс

TNewObject = class(TOldObject);

является потомком, или дочерним классом старого класса, называемого предком, или родительским классом. Добавляются к нему лишь новые поля, методы и свойства.

В Object Pascal все классы являются потомками класса TObject. Поэтому если строится дочерний класс прямо от TObject, то в определении TOject можно не упоминать. Следующие два выражения одинаково верны:

Поделиться:
Популярные книги

Идеальный мир для Лекаря 17

Сапфир Олег
17. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 17

Столичный доктор. Том III

Вязовский Алексей
3. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том III

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6

Всплеск в тишине

Распопов Дмитрий Викторович
5. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Всплеск в тишине

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

СД. Том 17

Клеванский Кирилл Сергеевич
17. Сердце дракона
Фантастика:
боевая фантастика
6.70
рейтинг книги
СД. Том 17

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд

Проект ’Погружение’. Том 1

Бредвик Алекс
1. Проект ’Погружение’
Фантастика:
фэнтези
рпг
постапокалипсис
5.00
рейтинг книги
Проект ’Погружение’. Том 1

Отборная бабушка

Мягкова Нинель
Фантастика:
фэнтези
юмористическая фантастика
7.74
рейтинг книги
Отборная бабушка

Дорога к счастью

Меллер Юлия Викторовна
Любовные романы:
любовно-фантастические романы
6.11
рейтинг книги
Дорога к счастью