ВУЗ:
Составители:
Рубрика:
59
result:=(f(xmin)+f(xmax))*dx/2;
for i:=1 to 99 do result:=result+f(xmin+dx*i)*dx;
end
else raise Exception.Create('Integrand is undefined.');
// иначе возбудить исключение с сообщением
// "Подынтегральная функция не определена."
end;
Как и абстрактные методы, процедурные указатели позволяют от-
ложить на время часть реализации алгоритма. Более того, с их помощью
можно управлять ходом выполнения программы, выбирая для использо-
вания ту подпрограмму, которая являе тся наиболее подходящей в дан-
ный момент. Именно эти возможности потребуются нам для реализации
полиморфного поведения об ъ ектов в следующих примерах.
4.2. Абстрактные классы и обобщенные алгоритмы
В предыдущей части мы ввели класс Number для представления
элементов произвольного кольца. Здесь ту же роль будут играть записи
следующего вида:
Number = packed record
TypeNameIs: function(TypeName: String): Boolean;
Destroy: procedure(var n: PNumber);
Plus: function(n1, n2: PNumber): PNumber;
Minus: function(n1, n2: PNumber): PNumber;
Dot: function(n1, n2: PNumber): PNumber;
Slash: function(n1, n2: PNumber): PNumber;
Add: procedure(var n1: PNumber; n2: PNumber);
Subtract: procedure(var n1: PNumber; n2: PNumber);
MultiplyBy: procedure(var n1: PNumber; n2: PNumber);
DivideBy: procedure(var n1: PNumber; n2: PNumber);
end;
Каждая переменная типа Number содержит десять процедурных
указ ателей, восемь из которых предназначены для хранения адресов
подпрограмм, осуществляющих арифметические операции. Поскольку
для параметров и возвращаемых значений последних потребуется ос у -
ществлять приведение типа, здесь указан тип PNumber, определяемый
как ссылка на запись типа Number:
type PNumber = ^Number;
result:=(f(xmin)+f(xmax))*dx/2;
for i:=1 to 99 do result:=result+f(xmin+dx*i)*dx;
end
else raise Exception.Create('Integrand is undefined.');
// иначе возбудить исключение с сообщением
// "Подынтегральная функция не определена."
end;
Как и абс т ракт ны е м етод ы , процед урны е указ ат ел и поз в ол яют от-
л ожит ь на в рем я час т ь реал из ации ал горит м а. Б ол ее того, с ихпом ощь ю
м ожноуправ л ят ь ход ом в ы пол нения програм м ы , в ы бирая д л я ис пол ь з о-
в ания т у под програм м у, кот орая яв л яет с я наибол ее под ход ящей в д ан-
ны й м ом ент. И м енноэ т и в оз м ожнос т и пот ребуют с я нам д л я реал из ации
пол им орфногопов ед ения объектов в с л ед ующихприм ерах.
4.2. А б страктны е классы и о б о б щ енны е алго ритмы
В пред ы д ущей час т и м ы в в ел и кл ас с Number д л я пред с т ав л ения
эл ем ентов произ в ол ь ногокол ь ца. Зд ес ь т у же рол ь буд ут играт ь з апис и
с л ед ующегов ид а:
Number = packed record
TypeNameIs: function(TypeName: String): Boolean;
Destroy: procedure(var n: PNumber);
Plus: function(n1, n2: PNumber): PNumber;
Minus: function(n1, n2: PNumber): PNumber;
Dot: function(n1, n2: PNumber): PNumber;
Slash: function(n1, n2: PNumber): PNumber;
Add: procedure(var n1: PNumber; n2: PNumber);
Subtract: procedure(var n1: PNumber; n2: PNumber);
MultiplyBy: procedure(var n1: PNumber; n2: PNumber);
DivideBy: procedure(var n1: PNumber; n2: PNumber);
end;
Кажд ая перем енная т ипа Number с од ержит д ес ят ь процед урны х
указ ат ел ей, в ос ем ь из которы х пред наз начены д л я хранения ад рес ов
под програм м , ос ущес т в л яющих арифм ет ичес кие операции. Пос кол ь ку
д л я парам ет ров и в оз в ращаем ы хз начений пос л ед нихпот ребует с я ос у-
щес т в л ят ь прив ед ение т ипа, з д ес ь указ ан т ип PNumber, опред ел яем ы й
как с с ы л ка на з апис ь т ипа Number:
type PNumber = ^Number;
59
Страницы
- « первая
- ‹ предыдущая
- …
- 57
- 58
- 59
- 60
- 61
- …
- следующая ›
- последняя »
