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

UptoLike

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

74
res.num:=0;
res.den:=1;
result:=PNumber(res);
{ Поскольку функция Create теперь является методом, ее заголовок
определяется типом Number. В связи с этим здесь и в функциях
CreateAs, Plus, Minus, Dot, Slash приходится делать взаимообратные
приведения типа. }
end;
function CreateAs(n, m: Integer): PRational;
begin
if m<>0 then begin
result:=PRational(Create);
result.num:=n;
result.den:=m;
end
else raise Exception.Create('Illegal value of denominator');
end;
initialization
TypeRational.TypeName:='Rational';
TypeRational.Ancestor:=@TypeNumber;
// поле Ancestor ссылается на VMT типа Number
TypeRational.TypeNameIs:=TypeNumber.TypeNameIs;
// функция TypeNameIs остается той же, что и в типе Number
TypeRational.Create:=Create;
... // остальные указатели инициализируются адресами
// соответствующим образом названных подпрограмм
end.
Так как обе записи, Rational и RationalVMT, построены на основе
структур типа Number, динамическое связывание здесь будет работать
фактически так же, как и раньше (рис . 4.2).
Заметим далее, что поля Ancestor (предок ) объединяют все табл и -
цы виртуальных методов , фигурирующие в проекте, в одну древовид-
ную структуру (см. рис . 4.3). Благодаря этому, у нас появляется единый
механизм для вызова старых версий подпрограмм, аналогичный опера-
тору inherited.
  res.num:=0;
  res.den:=1;
  result:=PNumber(res);

{ Поскольку функция Create теперь является методом, ее заголовок
  определяется типом Number. В связи с этим здесь и в функциях
  CreateAs, Plus, Minus, Dot, Slash приходится делать взаимообратные
  приведения типа. }

end;

function CreateAs(n, m: Integer): PRational;
begin
  if m<>0 then begin
     result:=PRational(Create);
     result.num:=n;
     result.den:=m;
  end
  else raise Exception.Create('Illegal value of denominator');
end;

initialization

TypeRational.TypeName:='Rational';
TypeRational.Ancestor:=@TypeNumber;
    // поле Ancestor ссылается на VMT типа Number
TypeRational.TypeNameIs:=TypeNumber.TypeNameIs;
    // функция TypeNameIs остается той же, что и в типе Number
TypeRational.Create:=Create;
... // остальные указатели инициализируются адресами
    // соответствующим образом названных подпрограмм

end.


         Т ак как обе з апис и, Rational и RationalVMT, пос т роены на ос нов е
с т рукт ур т ипа Number, д инам ичес кое с в яз ы в ание з д ес ь буд ет работ ат ь
факт ичес ки т ак же, как и рань ш е (рис . 4.2).
         Зам ет им д ал ее, чтопол я Ancestor (пред ок) объед иняют в с е т абл и-
цы в ирт уал ь ны хм етод ов , фигурирующие в проект е, в од ну д рев ов ид -
ную с т рукт уру (с м . рис . 4.3). Б л агод аря э том у, у нас появ л яет с я ед ины й
м еханиз м д л я в ы з ов а с т ары хв ерс ий под програм м , анал огичны й опера-
тору inherited.




                                          74