ВУЗ:
Составители:
Рубрика:
36
Пример 3.1. Интерфейс класса PAryFraction.
PAryFraction = class(Rational) // p-ичное рациональное число
private // закрытые члены класса
base: Integer; // простое число p
protected // защищенные члены класса
function isPrime(value: Integer): boolean; // Является простым
function isPowerOfBase(value: Integer): boolean;
// Является степенью base
public // открытые члены класса
constructor Create;
constructor CreateAs(n, m: Integer);
procedure SetDen(value: Integer);
procedure SetBase(value: Integer); // Установить base
function GetBase: Integer; // Вернуть base
end;
Очевидно, что каждая p-ичная дробь характеризуется тремя чис -
лами: числителем , знаменателем и простым числом p , степенью котор о-
го является знаменатель. Поэтому к классу PAryFraction добавлено новое
поле base (основание степени) и открытые методы GetBase и SetBase
для чтения-записи его значений. Поскольку число, сохраняемое в поле
base, следует обязательно проверять на простоту, в раздел protected
включена соответствующая функция isPrime.
Далее, необходимо позаботиться о том , чтобы новое поле всегда
имело корректное значение и знаменатель представлял собой его сте-
пень. С этой целью класс PAryFraction переопределяет конструкторы Cre-
ate, CreateAs и метод SetDen своего предка. Кроме того, к перечню з а-
щищенных членов добавляется вспомогательная функция isPowerOfBase.
Обратимся теперь к реализации новых и переопределенных мет о-
дов , предполагая, что определения старого и нового классов находятся в
разных модулях. В этом случае нам оказываются доступны все члены
базового класса за исключением закрытых, то есть в данном конкретном
случае за исключением полей num и den, и здесь возникает небольшая
проблема.
Очевидно, что новая версия метода SetDen так или иначе должна
изменять величину знаменателя текущего объекта. Поскольку поле den в
производном классе недоступно, единственный способ сделать это —
использовать старый вариант той же процедуры , унаследованный из
класса Rational. Но простое упоминание собственного имени в реализ а-
ции метода SetDen будет воспринято как обычный рекурсивный вызов ,
что, разумеется, нам не подходит.
Пример 3.1. И нт ерфейс кл ас с а PAryFraction.
PAryFraction = class(Rational) // p-ичное рациональное число
private // закрытые члены класса
base: Integer; // простое число p
protected // защищенные члены класса
function isPrime(value: Integer): boolean; // Является простым
function isPowerOfBase(value: Integer): boolean;
// Является степенью base
public // открытые члены класса
constructor Create;
constructor CreateAs(n, m: Integer);
procedure SetDen(value: Integer);
procedure SetBase(value: Integer); // Установить base
function GetBase: Integer; // Вернуть base
end;
Очев ид но, чтокажд ая p-ичная д робь характ ериз ует с я т рем я чис -
л ам и: чис л ит ел ем , з нам енат ел ем и прос т ы м чис л ом p, с т епень ю которо-
гояв л яет с я з нам енат ел ь . Поэ том у к кл ас с у PAryFraction д обав л енонов ое
пол е base (ос нов ание с т епени) и от кры т ы е м етод ы GetBase и SetBase
д л я чт ения-з апис и его з начений. Пос кол ь ку чис л о, с охраняем ое в пол е
base, с л ед ует обяз ат ел ь но пров ерят ь на прос тот у, в раз д ел protected
в кл ючена с оот в ет с т в ующая функция isPrime.
Дал ее, необход им о поз аботит ь с я о том , чтобы нов ое пол е в с егд а
им ел о коррект ное з начение и з нам енат ел ь пред с т ав л ял с обой его с те-
пень . С э той цел ь ю кл ас с PAryFraction переопред ел яет конс т рукторы Cre-
ate, CreateAs и м етод SetDen с в оего пред ка. Кром е того, к перечню з а-
щищенны хчл енов д обав л яет с я в с пом огател ь наяфункция isPowerOfBase.
Обрат им с я т еперь к реал из ации нов ы хи переопред ел енны хм ето-
д ов , пред пол агая, чтоопред ел ения с т арогои нов огокл ас с ов наход ят с я в
раз ны хм од ул ях. В э том с л учае нам оказ ы в ают с я д ос т упны в с е чл ены
баз ов огокл ас с а з а ис кл ючением з акры т ы х, тоес т ь в д анном конкрет ном
с л учае з а ис кл ючением пол ей num и den, и з д ес ь в оз никает небол ь ш ая
пробл ем а.
Очев ид но, чтонов ая в ерс ия м етод а SetDen т ак ил и иначе д ол жна
из м енят ь в ел ичину з нам енат ел я т екущегообъект а. Пос кол ь ку пол е den в
произ в од ном кл ас с е нед ос т упно, ед инс т в енны й с пос об с д ел ат ь э то —
ис пол ь з ов ат ь с т ары й в ариант той же процед уры , унас л ед ов анны й из
кл ас с а Rational. Н опрос тое упом инание с обс т в енногоим ени в реал из а-
ции м етод а SetDen буд ет в ос принятокак обы чны й рекурс ив ны й в ы з ов ,
что, раз ум еет с я, нам не под ход ит.
36
Страницы
- « первая
- ‹ предыдущая
- …
- 34
- 35
- 36
- 37
- 38
- …
- следующая ›
- последняя »
