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

UptoLike

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

40
изменяться в процессе существов ания объекта, к открытому интерфейсу
класса необходимо добавить методы, позволяющие определять и мод и -
фицировать ее. Очевидно, размерность характеризуется одним ц елым
числом , поэтому данные методы будут иметь следующие объявления:
function GetDim: Integer; // определение размерности
procedure SetDim(value: Integer); // изменение размерности
3. Ясно, что для хранения адресов компонент вектора теперь не-
обходима структура данных переменного размера. Принципы построе-
ния таких структур хорошо известны , однако здесь мы не будем вруч-
ную создавать подходящую конструкцию, а воспользуемся готовым ти-
пом Object Pascal динамическим массивом (dynamic array), кот о-
рый как нельзя лучше соответствует нашим целям . Для корректного и с -
пользования динамических массивов нам необходимы некоторые свед е-
ния об их внутренней структуре.
Объявление переменной , представляющей собой (одномерный)
динамический массив , выглядит следующим образом :
ИмяПеременной: array of ИмяТипа;
где ИмяТипа определяет тип элементов массива. Данная переменная, как
и объектная, в действительности является указателем со всеми выте-
кающими отсюда последствиями.
Изначально, значение указателя равно nil. Для реального разме-
щения в памяти и удаления из нее элементов массива используется
процедура SetLength, принимающая два параметра: имя переменной -
мас сива и длину. Если новая длина больше старой , к массиву добавл я-
ются элементы (значения уже имеющихся при этом сохраняются), если
меньше массив усекается до указанного размера. В частности, для
пол ного удаления массива из памяти следует установить его длину
рав ной нулю.
Текущую длину массива возвращает функция Length, принимаю-
щая в качестве единственного параметра имя перемен ной - мас сива.
Обращение к элементам массива осуществляется обычным обр а -
зом с помощью оператора индексирования. При этом индексы всегда
являются целыми числами и начинаются с нуля. Таким образом , массив
a состоит из элементов a [ 0 ] , a[1], , a[Length(a)-1]. Выход индекса за
пределы допустимого отрезка приводит к ошибке во время выполнения.
Вернемся теперь к нашему классу и определим поле comp сле-
дующим образом :
comp: array of Rational;
Поскольку длину этого массива всегда можно определить с помощью
из м енят ь с я в проц ес с е с ущ ес т в ов ания объект а, к от кры т ом у инт ерфейс у
кл ас с а необход им од обав ит ь м етод ы , поз в ол яющ ие опред ел ят ь и м од и-
фиц иров ат ь ее. О чев ид но, раз м ернос т ь характ ериз ует с я од ним ц ел ы м
чис л ом , поэтом у д анны е м ет од ы буд ут им ет ь с л ед ующ ие объяв л ения:
function GetDim: Integer;         // определение размерности
procedure SetDim(value: Integer); // изменение размерности
         3. Яс но, что д л я хранения ад рес ов ком понент в ектора т еперь не-
обход им а с т рукт ура д анны х перем енного раз м ера. Принц ипы пос т рое-
ния т аких с т рукт ур хорошо из в ес т ны , од нако з д ес ь м ы не буд ем в руч-
ную с оз д ав ат ь под ход ящ ую конс т рукц ию, а в ос пол ь з уем с я готов ы м т и-
пом Object Pascal — дин а миче ским ма ссивом (dynamic array), — кото-
ры й как нел ь з я л учше с оот в ет с т в ует нашим ц ел ям . Дл я коррект ногоис -
пол ь з ов ания д инам ичес ких м ас с ив ов нам необход им ы некоторы е с в ед е-
ния об их в нут ренней с т рукт уре.
         О бъяв л ение перем енной, пред с т ав л яющ ей с обой (од ном ерны й)
д инам ичес кий м ас с ив , в ы гл яд ит с л ед ующ им образ ом :
ИмяПеременной: array of ИмяТипа;
гд е И м я Типа опред ел яет т ип эл ем ентов м ас с ив а. Данная перем енная, как
и объект ная, в д ейс т в ит ел ь нос т и яв л яет с я указ ат ел ем с о в с ем и в ы т е-
кающ им и от с юд а пос л ед с т в иям и.
         И з начал ь но, з начение указ ат ел я рав ноnil. Дл я реал ь ногораз м е-
щ ения в пам ят и и уд ал ения из нее эл ем ент ов м ас с ив а ис пол ь з ует с я
проц ед ура SetLength, приним ающ ая д в а парам ет ра: им я перем енной-
м ас с ив а и д л ину. Е с л и нов ая д л ина бол ь ше с т арой, к м ас с ив у д обав л я-
ют с я эл ем ент ы (з начения уже им еющ ихс я при эт ом с охраняют с я), ес л и
м ень ше — м ас с ив ус екает с я д о указ анногораз м ера. В час т нос т и, д л я
пол ного уд ал ения м ас с ив а из пам ят и с л ед ует ус т анов ит ь его д л ину
рав ной нул ю.
         Текущ ую д л ину м ас с ив а в оз в ращ ает функц ия Length, приним аю-
щ ая в качес т в е ед инс т в енногопарам ет ра им я перем енной-м ас с ив а.
         О бращ ение к эл ем ент ам м ас с ив а ос ущ ес т в л яет с я обы чны м обра-
з ом с пом ощ ь ю оператора инд екс иров ания. При этом инд екс ы в с егд а
яв л яют с я ц ел ы м и чис л ам и и начинают с я с нул я. Т аким образ ом , м ас с ив
a с ос тоит из эл ем ентов a[0], a[1], … , a[Length(a)-1]. Вы ход инд екс а з а
пред ел ы д опус т им огоот рез ка прив од ит к ошибке в ов рем я в ы пол нения.
         Вернем с я т еперь к нашем у кл ас с у и опред ел им пол е comp с л е-
д ующ им образ ом :
comp: array of Rational;
Пос кол ь ку д л ину этого м ас с ив а в с егд а м ожно опред ел ит ь с пом ощ ь ю


                                           40