ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 72
- 73
- 74
- 75
- 76
- …
- следующая ›
- последняя »