Разработка классов на языке Object Pascal. Соколов Е.В. - 68 стр.

UptoLike

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

68
В МЕСТО ЗАКЛЮЧЕНИЯ
Приведенная в настоящих методических указаниях серия задач,
следуя основной идее пособия [*], ставила своей целью показать, как,
имея определенный опыт процедурного программирования, использо-
вать его для создания классов и обобщенных алгоритмов . Разумеется,
разработку нового класса совсем необязательно каждый раз начинать с
построения соответствующей библиотеки подпрограмм. Способность
определять интерфейс класса прямо по формулировке задачи и выпол -
нять его реализацию без процедурного аналога появляется достаточно
быстро. В то же время рассмотренные здесь задачи весьма просты, и
умение их решать это лишь первый шаг в освоении объектной тех-
нол огии.
Читатель, вероятно, уже заметил определенные аналогии между
интерфейсами классов DynamicVector и Number. Оба они содержат мет о-
ды Plus, Minus, Add, Subtract, IsEqual и Assign, объявленные схожим об-
разом . Поэтому возникает вопрос , нельзя ли сделать первый из указан-
ных классов производным от второго.
На первый взгляд эта идея противоречит правилам наследования.
Класс Number представляет абстрактное поле, а векторы образуют лишь
группу относительно сложения, не являющуюся его подтипом . Однако,
предполагая, что алгебраические операции допускают частичное опре-
деление, мы можем рассматривать любую группу или кольцо как поле.
Такой подход уже был использован нами в параграфе 4 при по-
строении класса Whole. Единственный минус здесь в том , что невоз-
можность выполнения операции обнаруживается лишь во время выпол -
нения программы, а не во время компиляции. Плюсом же является бóль-
шая универсальность созданного кода. Кроме того, у нас появляется
принципиальная возможность построения сколь угодно сложных струк-
тур данных: многочленов от нескольких переменных, матриц над кол ь -
цами многоч ленов и т . п .
Впрочем , для реализации указанной возможности необходимо
сначала разработать соответствующие клас сы-кон тейнеры . Сделать это
можно несколькими способами. Первый и самый простой начинать
каждый новый класс практически с чистого листа, нас ледуя прямо от
класса Number. Нетрудно предсказать, однако, что уже после создания
двух-трех классов в их реализациях станет заметно значительное дубл и -
рование кода.
С самого начала эти повторы можно попытаться исключить, если
в качестве базового класса взять не Number, а DynamicVector. Но здесь
                            В М Е СТ О ЗА К Л Ю ЧЕ Н И Я

         Прив ед енная в нас т оящ их м етод ичес ких указ аниях с ерия з ад ач,
с л ед уя ос нов ной ид ее пос обия [*], с т ав ил а с в оей ц ел ь ю показ ат ь , как,
им ея опред ел енны й опы т проц ед урного програм м иров ания, ис пол ь з о-
в ат ь его д л я с оз д ания кл ас с ов и обобщ енны х ал горит м ов . Р аз ум еет с я,
раз работ ку нов огокл ас с а с ов с ем необяз ат ел ь нокажд ы й раз начинат ь с
пос т роения с оот в ет с т в ующ ей библ иот еки под програм м . С пос обнос т ь
опред ел ят ь инт ерфейс кл ас с а прям о поформ ул иров ке з ад ачи и в ы пол -
нят ь его реал из ац ию без проц ед урного анал ога появ л яет с я д ос т аточно
бы с т ро. В то же в рем я рас с м от ренны е з д ес ь з ад ачи в ес ь м а прос т ы , и
ум ение их решат ь — эт ол ишь перв ы й шаг в ос в оении объект ной т ех-
нол огии.
         Ч ит ат ел ь , в ероят но, уже з ам ет ил опред ел енны е анал огии м ежд у
инт ерфейс ам и кл ас с ов DynamicVector и Number. О ба они с од ержат м ето-
д ы Plus, Minus, Add, Subtract, IsEqual и Assign, объяв л енны е с хожим об-
раз ом . Поэтом у в оз никает в опрос , нел ь з я л и с д ел ат ь перв ы й из указ ан-
ны х кл ас с ов произ в од ны м от в торого.
         Н а перв ы й в з гл яд эт а ид ея прот ив оречит прав ил ам нас л ед ов ания.
Кл ас с Number пред с т ав л яет абс т ракт ное пол е, а в екторы образ уют л ишь
группу от нос ит ел ь нос л ожения, не яв л яющ уюс я егопод т ипом . О д нако,
пред пол агая, что ал гебраичес кие операц ии д опус кают час т ичное опре-
д ел ение, м ы м ожем рас с м ат рив ат ь л юбую группу ил и кол ь ц окак пол е.
         Т акой под ход уже бы л ис пол ь з ов ан нам и в параграфе 4 при по-
с т роении кл ас с а Whole. Е д инс т в енны й м инус з д ес ь в том , что нев оз -
м ожнос т ь в ы пол нения операц ии обнаружив ает с я л ишь в ов рем я в ы пол -
нения програм м ы , а не в ов рем я ком пил яц ии. Пл юс ом же яв л яет с я бóл ь -
шая унив ерс ал ь нос т ь с оз д анного код а. Кром е того, у нас появ л яет с я
принц ипиал ь ная в оз м ожнос т ь пос т роения с кол ь угод нос л ожны х с т рук-
т ур д анны х: м ногочл енов от нес кол ь ких перем енны х, м ат риц над кол ь -
ц ам и м ногочл енов и т. п.
         Впрочем , д л я реал из ац ии указ анной в оз м ожнос т и необход им о
с начал а раз работ ат ь с оот в ет с т в ующ ие кл ас с ы -конт ейнеры . С д ел ат ь это
м ожно нес кол ь ким и с пос обам и. Перв ы й и с ам ы й прос той — начинат ь
кажд ы й нов ы й кл ас с практ ичес ки с чис того л ис т а, нас л ед уя прям о от
кл ас с а Number. Н ет руд но пред с каз ат ь , од нако, что уже пос л е с оз д ания
д в ух-т рех кл ас с ов в их реал из ац иях с т анет з ам ет ноз начит ел ь ное д убл и-
ров ание код а.
         С с ам огоначал а эт и пов торы м ожнопопы т ат ь с я ис кл ючит ь , ес л и
в качес т в е баз ов ого кл ас с а в з ят ь не Number, а DynamicVector. Н о з д ес ь

                                          68