В терминах Паскаля, объект во многом схож с записью, которая
является оболочкой для объединения нескольких связанных элементов
под одним именем. Предположим, вы хотите разработать программу
вывода платежной ведомости, печатающую отчет и показывающую,
сколько нужно выплатить каждому служащему за рабочий день. Запись
можно организовать следующим образом:
TEmployee = record
Name: string[25];
Title: string[25];
Rate: Real;
end;
Примечание: По соглашению все типы начинаются с буквы
T. Вы также можете следовать этому правилу.
Здесь TEmployee является типом записи, т.е. шаблоном, ис-
пользуемым компилятором для создания переменных типа запись. Пе-
ременная типа TEmployee является экземпляром этого типа. Термин
"экземпляр" будет вам нередко встречаться в Паскале. Он постоянно
применяется теми, кто использует методы объектно-ориентированного
программирования, поэтому будет хорошо, если вы начнете мыслить в
терминах типов и экземпляров этих типов.
Вы можете оперировать с типом TEmployee двояко. Вы можете
рассматривать поля Name, Title и Rate по отдельности, а когда о
полях, как о работающих одновременно для описания конкретного
рабочего, вы можете рассматривать их совокупность, как TEmployee.
Предположим, что на вашей фирме работает несколько типов
рабочих. Одни из них имеют почасовую оплату, другие - оклад,
третьи - тарифную ставку и так далее. Ваша программа должна учи-
тывать все эти типы. Вы можете создать другой тип записи для каж-
дого типа рабочего. Например, для получения данных о том, сколько
должен получить рабочий с почасовой оплатой, нужно знать, сколько
часов он отработал. Можно построить запись THourly вида:
THourly = record
Name: string[25];
Title: string[25];
Rate: Real;
end;
Вы можете также оказаться несколько догадливее и сохранить
тип TEmployee путем создания поля типа TEmployee внутри типа
THourly:
THourly = record
Worker: TEmployee;
Time: integer;
end;
Такая конструкция работает, и программисты, работающие на
Паскале, делают это постоянно. Единственное, чего этот метод не
делает, так это то, что он заставляет вас думать о том, с чем вы
работаете в вашем программном обеспечении. Вам следует задаться
вопросом типа; "Чем почасовик отличается от дpугих pабочих?" От-
вет прост: почасовик - это pабочий, котоpому платится за коли-
чество часов pаботы. Продумайте снова первую часть предложения;
почасовик - это pабочий...
Теперь вы поняли!
Запись для pаботника-почасовика hourly должна иметь все за-
писи, котоpые имеются в записи employee. Tип THourly является до-
черним типом для типа TEmployee. THourly наследует все, что при-
надлежит TEmployee, и кроме того имеет кое-что новое, что делает
THourly уникальным.
Этот процесс, с помощью которого один тип наследует характе-
ристики другого типа, называется наследованием. Наследник называ-
ется порожденным (дочерним) типом, а тип, которому наследует до-
черний тип, называется порождающим (родительским) типом.
Ранее известные типы записей Паскаля не могут наследовать.
Однако Borland Pascal расширяет язык Паскаль для поддержки насле-
дования. Одним из этих расширений является новая категория струк-
туры данных, связанная с записями, но значительно более мощная.
Типы данных в этой новой категории определяются с помощью нового
зарезервированного слова object. Тип объекта может быть определен
как полный, самостоятельный тип в манере описания записей Паска-
ля, но он может определяться и как потомок существующего типа
объекта путем помещения порождающего (родительского) типа в скоб-
ки после зарезервированного слова object.
В приводимом здесь примере платежной ведомости два связанных
типа объектов могли бы определяться следующим образом:
type
TEmployee = object
Name: string[25];
Title: string[25];
Rate : Real;
end;
THourly = object(TEmployee)
Time : Integer;
end;
Примечание: Обратите внимание, что здесь использование
скобок означает наследование.
Здесь TEmployee является родительским типом, а THourly - до-
черним типом. Как вы увидите чуть позднее, этот процесс может
продолжаться неопределенно долго. Вы можете определить дочерний
тип THourly, дочерний к типу THourly тип и т.д. Большая часть
конструирования объектно-ориентированных прикладных программ сос-
тоит в построении такой иерархии объектов, являющейся отражением
генеалогического дерева объектов в приложениях.
Все возможные типы, наследующие тип TEmployee, называются
дочерними типами типа TEmployee, тогда как THourly является не-
посредственным дочерним типом типа TEmployee. Наоборот, TEmployee
является непосредственным родителем типа THourly. Тип объекта (в
точности как подкаталог в DOS) может иметь любое число непосредс-
твенных дочерних типов, но в то же время только одного непосредс-
твенного родителя.
Как показали данные определения, объекты тесно связаны с за-
писями. Новое зарезервированное слово object является наиболее
очевидным различием, но как вы увидите позднее, имеется большое
число других различий, некоторые из которых довольно тонкие.
Например, поля Name, Title и Rate в типе TEmployee не указа-
ны явно в типе THourly, но в любом случае тип THourly содержит их
благодаря свойству наследования. Вы можете говорить о величине
Name типа THourly в точности так же, как о величине Name типа
TEmployee.