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

UptoLike

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

53
Matrix = array[1..n,1..n] of Number;
и в объявлении локальной переменной p функции MultiplyMatrix. Чтобы
сделать эти изменения возможными, раздел интерфейса данного модуля
должен подключать UnitNumber вместо UnitRational.
В результате всех исправлений мы получаем , наконец, обобщен-
ные алгоритмы, пригодные для вычислений над любым кольцом : доста-
точно лишь создать подходящего потомка класса Number. При этом раз -
работка новых классов не будет оказывать никакого влияния на модуль
UnitAlgorithms, его не придется даже переком пил ировать.
В заключение посмотрим , как следует изменить классы Rational и
PAryFraction, чтобы они стали производными от Number. Воспользовав-
шись случаем , объявим все методы этих классов виртуальными. Искл ю-
чение стоит сделать лишь для конструкторов , вызываемых обычно пу-
тем явного указания имени типа, и для функции PAryFraction.isPrime,
реализация которой в действительности никак не зависит от содержаще-
го ее класса.
Пример 3.7. Модифицированный раздел интерфейса модуля UnitRational.
unit UnitRational;
interface
uses UnitNumber; // подключаем модуль с определением класса Number
type
Rational = class(Number) // указываем Number в качестве предка
private
num: Integer;
den: Integer;
protected
procedure Normalize; virtual;
procedure Reduce; virtual;
public
constructor Create;
constructor CreateAs(n, m: Integer);
function Plus (n: Number): Number; override; //
function Minus(n: Number): Number; override; //
function Dot (n: Number): Number; override; // замещаем
function Slash(n: Number): Number; override; // абстрактные
procedure Add (n: Number); override; // методы
procedure Subtract (n: Number); override; //
procedure MultiplyBy(n: Number); override; //
procedure DivideBy (n: Number); override; //
                     Matrix = array[1..n,1..n] of Number;
и в объяв л ении л окал ь ной перем енной p функции MultiplyMatrix. Ч тобы
с д ел ат ь э т и из м енения в оз м ожны м и, раз д ел инт ерфейс а д анногом од ул я
д ол жен под кл ючат ь UnitNumber в м ес тоUnitRational.
          В рез ул ь т ат е в с ехис прав л ений м ы пол учаем , наконец, обобщен-
ны е ал горит м ы , пригод ны е д л я в ы чис л ений над л юбы м кол ь цом : д ос т а-
точнол иш ь с оз д ат ь под ход ящегопотом ка кл ас с а Number. При э том раз -
работ ка нов ы хкл ас с ов не буд ет оказ ы в ат ь никакогов л ияния на м од ул ь
UnitAlgorithms, егоне прид ет с я д аже переком пил иров ат ь .
          В з акл ючение пос м от рим , как с л ед ует из м енит ь кл ас с ы Rational и
PAryFraction, чтобы они с т ал и произ в од ны м и от Number. Вос пол ь з ов ав -
ш ис ь с л учаем , объяв им в с е м етод ы э т ихкл ас с ов в ирт уал ь ны м и. И с кл ю-
чение с тоит с д ел ат ь л иш ь д л я конс т рукторов , в ы з ы в аем ы хобы чно пу-
т ем яв ного указ ания им ени т ипа, и д л я функции PAryFraction.isPrime ,
реал из ация которой в д ейс т в ит ел ь нос т и никак не з ав ис ит от с од ержаще-
гоее кл ас с а.

П р им ер 3.7. М од ифициров анны й раз д ел интерфейс а м од ул я UnitRational.

unit UnitRational;

interface
uses UnitNumber; // подключаем модуль с определением класса Number

type
  Rational = class(Number) // указываем Number в качестве предка
  private
    num: Integer;
    den: Integer;
  protected
    procedure Normalize;                virtual;
    procedure Reduce;                   virtual;
  public
    constructor Create;
    constructor CreateAs(n, m: Integer);
    function Plus (n: Number): Number; override; //
    function Minus(n: Number): Number; override; //
    function Dot (n: Number): Number; override; // замещаем
    function Slash(n: Number): Number; override; // абстрактные
    procedure Add       (n: Number);    override; // методы
    procedure Subtract (n: Number);     override; //
    procedure MultiplyBy(n: Number);    override; //
    procedure DivideBy (n: Number);     override; //



                                          53