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

UptoLike

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

26
В самом деле, любое рациональное число имеет целые числитель
и знаменатель, и необходимость хранить их именно в двух полях типа In-
teger никак не следует из объявлений новых методов . Однако явное ука-
зание скалярного (простого) типа для параметров и возвращаемых зна-
чений этих подпрограмм ог раничивает диапазон допустимых значений
числителя и знаменателя. Более правильным было бы определить свой
класс и для представления целых чисел , но тогда соответствующие про-
блемы возникли бы уже для него.
В действительности, единственным решением , позволяющим
создавать истинно абстрактные типы , является полный отказ от испол ь -
зования скалярных типов данных. Языки, реализующие данный подход ,
то есть являющиеся чисто объектно-ориентированными, существуют, од -
нако все они проигрывают языкам со смешанной моделью в плане быст-
родействия.
Завершим теперь разработку библ иотеки, реализовав методы клас -
са Rational.
Пример 2.5. Определение модуля, содержащего класс Rational.
unit UnitRational;
interface
type
Rational = class
... // здесь располагается интерфейс класса, приведенный выше
end;
implementation
uses SysUtils; // модуль включает поддержку исключений
function Rational.GetNum: Integer;
begin result:=self.num; end;
function Rational.GetDen: Integer;
begin result:=self.den; end;
procedure Rational.SetNum(value:Integer);
begin self.num:=value; end;
procedure Rational.SetDen(value:Integer);
begin
if value>0 then // знаменатель всегда должен быть положителен
self.den:=value
else // иначе возбуждается исключение с сообщением
// "Недопустимое значение знаменателя"
              В с ам ом д ел е, л юбое рационал ь ное чис л оим еет цел ы е чис л ит ел ь
   и з нам енат ел ь , и необход им ос т ь хранит ь ихим еннов д в ухпол яхт ипа In-
   teger никак не с л ед ует из объяв л ений нов ы хм етод ов . Од накояв ное ука-
   з ание с кал ярного (прос того) т ипа д л я парам ет ров и в оз в ращаем ы хз на-
   чений эт их под програм м ограничив ает д иапаз он д опус т им ы х з начений
   чис л ит ел я и з нам енат ел я. Б ол ее прав ил ь ны м бы л о бы опред ел ит ь с в ой
   кл ас с и д л я пред с т ав л ения цел ы хчис ел , нотогд а с оот в ет с т в ующие про-
   бл ем ы в оз никл и бы уже д л я него.
              В д ейс т в ит ел ь нос т и, ед инс т в енны м реш ением , поз в ол яющим
   с оз д ав ат ь ис т инноабс т ракт ны е т ипы , яв л яет с я пол ны й от каз от ис пол ь -
   з ов ания с кал ярны хт ипов д анны х. Яз ы ки, реал из ующие д анны й под ход ,
   тоес т ь яв л яющиес я чис тообъект но-ориент иров анны м и, с ущес т в уют, од -
   наков с е они проигры в ают яз ы кам с ос м еш анной м од ел ь ю в пл ане бы с т -
   род ейс т в ия.
        Зав ерш им т еперь раз работ ку библ иот еки, реал из ов ав м етод ы кл ас -
с а Rational.

Пример 2.5. Опред ел ение м од ул я, с од ержащегокл ас с Rational.

unit UnitRational;

interface
type
  Rational = class
     ... // здесь располагается интерфейс класса, приведенный выше
  end;

implementation
uses SysUtils; // модуль включает поддержку исключений

function Rational.GetNum: Integer;
  begin result:=self.num; end;

function Rational.GetDen: Integer;
  begin result:=self.den; end;

procedure Rational.SetNum(value:Integer);
  begin self.num:=value; end;

procedure Rational.SetDen(value:Integer);
  begin
    if value>0 then // знаменатель всегда должен быть положителен
      self.den:=value
    else            // иначе возбуждается исключение с сообщением
                    // "Недопустимое значение знаменателя"


                                              26