Введение в объектно-ориентированное программирование на языке Object Pascal. Соколов Е.В. - 60 стр.

UptoLike

Составители: 

60
В отличие от клас са Number, унаследованного от TObject, мы оп-
ределяем новый тип «с нуля» и поэтому должны самостоятельно реал и-
зовать все необходимые нам операции. Функция TypeNameIs использу-
ется для выяснения типа объекта во время выполнения программы, про-
цедура Destroy для его удаления
3
. Обе эти подпрограммы можно оп-
ределить уже сейчас :
function TypeNameIs(TypeName: String): Boolean;
begin
if TypeName='Number' then result:=true else result:=false;
end;
procedure Destroy(var n: PNumber);
begin
Dispose(n); // процедура Dispose освобождает область памяти
// размером в одну запись типа Number
end;
Несмотря на то, что называются функция и процедура так же, как
и указатели в определении типа Number, присваивать их адреса полям
объектов придется вручную. Введем для этого специальную функцию
Create, поместив ее в один модуль с объявлениями типов Number, PNum-
ber и определениями подпрограмм TypeNameIs и Destroy:
function Create: PNumber;
begin
New(result);
result.Destroy:=Destroy;
result.TypeNameIs:=TypeNameIs;
end;
Она играет здесь роль конструктора: размещает в памяти экзем-
пляр объ екта, сопоставляет некоторым его полям подпрограммы и воз-
вращает ад рес в качестве значения. Заметим , что к полям записи, ад ре-
суемой переменной result, как и к полям н астоящего объекта, допуска-
ется обращение без операции разыменовывания: result.Destroy вместо
result^.Destroy.
3
Здесь и далее в этой части мы будем использовать термины объект, метод и
наслед ование применительно к записям , подчеркивая тем самым аналогию с
объектной мод е лью. Кроме того, как и ранее, объектом будет называться и
собственно область памяти, содержащая экземпляр записи, и переменная, ссы-
лающаяся на эту область.
          В отл ичие от кл ас с а Number, унас л ед ов анногоот TObject, м ы оп-
ред ел яем нов ы й т ип «с нул я» и поэ том у д ол жны с ам ос т оят ел ь нореал и-
з ов ат ь в с е необход им ы е нам операции. Ф ункция TypeNameIs ис пол ь з у-
ет с я д л я в ы яс нения т ипа объект а в ов рем я в ы пол нения програм м ы , про-
цед ура Destroy — д л я егоуд ал ения3. Обе э т и под програм м ы м ожнооп-
ред ел ит ь уже с ейчас :

function TypeNameIs(TypeName: String): Boolean;
begin
  if TypeName='Number' then result:=true else result:=false;
end;

procedure Destroy(var n: PNumber);
begin
  Dispose(n); // процедура Dispose освобождает область памяти
              // размером в одну запись типа Number
end;


       Н ес м от ря на то, чтоназ ы в ают с я функция и процед ура т ак же, как
и указ ат ел и в опред ел ении т ипа Number, прис в аив ат ь ихад рес а пол ям
объектов прид ет с я в ручную. Вв ед ем д л я э того с пециал ь ную функцию
Create, пом ес т ив ее в од ин м од ул ь с объяв л ениям и т ипов Number, PNum-
ber и опред ел ениям и под програм м TypeNameIs и Destroy:

function Create: PNumber;
begin
  New(result);
  result.Destroy:=Destroy;
  result.TypeNameIs:=TypeNameIs;
end;


        Она играет з д ес ь рол ь конс т рукт ора: раз м ещает в пам ят и э кз ем -
пл яр объект а, с опос т ав л яет некоторы м егопол ям под програм м ы и в оз -
в ращает ад рес в качес т в е з начения. Зам ет им , чт ок пол ям з апис и, ад ре-
с уем ой перем енной result, как и к пол ям нас т оящегообъект а, д опус ка-
ет с я обращение без операции раз ы м енов ы в ания: result.Destroy в м ес то
result^.Destroy.

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

                                               60