ВУЗ:
Составители:
Рубрика:
61
Решение оставить процедурные указатели, соответствующие аб-
страктным методам , неинициализированными выглядит вполне естес т -
венным, однако каждый такой указатель представляет собой потенциал ь-
ную угрозу. Если пользователь попытается вызвать метод , осуществ-
ляющий арифметическую операцию, для объекта типа Number, то дал ь-
нейший ход выполнения приложения становится совершенно непредска-
зуемым. Поэтому правильнее было бы определить под программы
function AbstractBinaryOperator(n1, n2: PNumber): PNumber;
begin // абстрактный бинарный оператор
raise Exception.Create('Call of abstract method.');
// просто возбудить исключение с сообщением
// "Вызов абстрактного метода."
end;
procedure AbstractAssignOperator(var n1: PNumber; n2: PNumber);
begin // абстрактный оператор с присвоением
raise Exception.Create('Call of abstract method.');
end;
и в функции Create присваивать их адреса всем свободным указателям :
result.Plus:=AbstractBinaryOperator;
result.Minus:=AbstractBinaryOperator;
...
result.Add:=AbstractAssignOperator;
...
Следует отметить, что компилятор всегда выдает предупрежде-
ние, если встречает вызов конструктора для класса с незамещенными аб-
страктными мет одами. При отказе от использования объектной модели
никакой п омощи с его стороны ожидать уже не приходится.
Посмотрим теперь , как будут выглядеть наши обобщенные алго-
ритмы.
Пример 4.1. Процедурная версия модуля UnitAlgorithms.
unit UnitAlgorithms;
interface
uses UnitNumber; // подключаем модуль с определениями типов
// Number, PNumber и функции Create
const n = 3;
Реш ение ос т ав ит ь процед урны е указ ат ел и, с оот в ет с т в ующие аб-
с т ракт ны м м етод ам , неинициал из иров анны м и в ы гл яд ит в пол не ес т ес т -
в енны м , од накокажд ы й т акой указ ат ел ь пред с т ав л яет с обой пот енциал ь -
ную угроз у. Е с л и пол ь з ов ат ел ь попы т ает с я в ы з в ат ь м етод , ос ущес т в -
л яющий арифм ет ичес кую операцию, д л я объект а т ипа Number, тод ал ь -
нейш ий ход в ы пол нения прил ожения с т анов ит с я с ов ерш еннонепред с ка-
з уем ы м . Поэтом у прав ил ь нее бы л обы опред ел ит ь под програм м ы
function AbstractBinaryOperator(n1, n2: PNumber): PNumber;
begin // абстрактный бинарный оператор
raise Exception.Create('Call of abstract method.');
// просто возбудить исключение с сообщением
// "Вызов абстрактного метода."
end;
procedure AbstractAssignOperator(var n1: PNumber; n2: PNumber);
begin // абстрактный оператор с присвоением
raise Exception.Create('Call of abstract method.');
end;
и в функции Create прис в аив ат ь ихад рес а в с ем с в обод ны м указ ат ел ям :
result.Plus:=AbstractBinaryOperator;
result.Minus:=AbstractBinaryOperator;
...
result.Add:=AbstractAssignOperator;
...
Сл ед ует от м ет ит ь , что ком пил ятор в с егд а в ы д ает пред упрежд е-
ние, ес л и в с т речает в ы з ов конс т руктора д л я кл ас с а с нез ам ещенны м и аб-
с т ракт ны м и м етод ам и. При от каз е от ис пол ь з ов ания объект ной м од ел и
никакой пом ощи с егос тороны ожид ат ь уже не приход ит с я.
Пос м от рим т еперь , как буд ут в ы гл яд ет ь наш и обобщенны е ал го-
рит м ы .
Пример 4.1. Процед урная в ерс ия м од ул я UnitAlgorithms.
unit UnitAlgorithms;
interface
uses UnitNumber; // подключаем модуль с определениями типов
// Number, PNumber и функции Create
const n = 3;
61
Страницы
- « первая
- ‹ предыдущая
- …
- 59
- 60
- 61
- 62
- 63
- …
- следующая ›
- последняя »
