ВУЗ:
Составители:
Рубрика:
48
3. У НИВЕРСАЛЬНЫЕ КОНТЕЙНЕРЫ
В этом параграфе нашей целью будет создание класса для пред -
ставления векторов , компоненты которых могут принадлежать любым
классам , унаследованным от Number. Естественно, что опираться мы
будем на созданный в предыдущей задаче класс DynamicRVector. Оче-
видно также, что код этого класса нужно будет изменить таким образом ,
чтобы в нем не осталось никаких упоминаний о рациональных числах.
И здесь возникает один принципиальный вопрос : чем заменить инс т-
рукцию Rational.Create в методах ScalarProduct и SetDim?
Более точно проблема формулируется следующим образом : необ-
ходимо создать экземпляр класса, производного от Number, причем ка-
кого именно, станет известно только во время выполнения програм мы.
Более того, исходно вектор не содержит ни одной компоненты, кот орую
можно было бы использовать в качестве образца для клонирования. По-
этому для хранения информации о типе компонент нужно использовать
какой - то другой способ .
В языке Object Pascal описанная проблема может быть решена с
помощью классовых ссылок (class references).
Тип ссылки на класс определяется следующим обр азом :
ИмяТипаСсылкиНаКласс = class of ИмяКласса
где ИмяТипаСсылкиНаКласс — имя нового типа, ИмяКласса — имя лю-
бого класса.
После этого переменные, являющиеся ссылками на указанный
класс, объявляются обычным образом :
ИмяСсылкиНаКласс: ИмяТипаСсылкиНаКласс
(использовать выражение class of ИмяКласса прямо в объявлении пере-
менной нельзя).
С точки зрения внутреннего представления ссылка на класс пред -
ставляет собой указатель на таблицу виртуальных методов данного
класса. Однако вызвать с ее помощью обычный виртуальный метод н е -
возможно, поскольку ему необходимо передать адрес конкретного об ъ -
екта. Классовые ссылки применяются лишь для вызова конструкторов и
специальных классовых методов (class methods), кот орым объект класса
не нужен. Синтаксис вызова такой же, как и при использовании обы ч -
ных объектных ссылок :
ИмяСсылкиНаКласс.ИмяКонструктораИлиКлассовогоМетода(Параметры)
Хотя классовые ссылки и являются указателями, структуры дан-
ных, которые они адресуют, никогда не меняются и используются только
3. У Н И В Е РСА Л ЬН Ы Е К О Н Т Е Й Н Е РЫ
В этом параграфе нашей ц ел ь ю буд ет с оз д ание кл ас с а д л я пред -
с т ав л ения в екторов , ком понент ы которы х м огут принад л ежат ь л юбы м
кл ас с ам , унас л ед ов анны м от Number. Е с т ес т в енно, что опират ь с я м ы
буд ем на с оз д анны й в пред ы д ущ ей з ад аче кл ас с DynamicRVector. О че-
в ид нот акже, чтокод этогокл ас с а нужнобуд ет из м енит ь т аким образ ом ,
чтобы в нем не ос т ал ос ь никаких упом инаний орац ионал ь ны х чис л ах.
И з д ес ь в оз никает од ин принц ипиал ь ны й в опрос : чем з ам енит ь инс т -
рукц ию Rational.Create в м етод ах ScalarProduct и SetDim?
Бол ее точнопробл ем а форм ул ирует с я с л ед ующ им образ ом : необ-
ход им о с оз д ат ь экз ем пл яр кл ас с а, произ в од ного от Number, причем ка-
когоим енно, с т анет из в ес т но тол ь ко в о в рем я в ы пол нения програм м ы .
Бол ее того, ис ход нов ектор не с од ержит ни од ной ком понент ы , которую
м ожнобы л обы ис пол ь з ов ат ь в качес т в е образ ц а д л я кл ониров ания. По-
этом у д л я хранения информ ац ии от ипе ком понент нужноис пол ь з ов ат ь
какой-тод ругой с пос об.
В яз ы ке Object Pascal опис анная пробл ем а м ожет бы т ь решена с
пом ощ ь ю кл а ссовых ссыл ок (class references).
Т ип с с ы л ки на кл ас с опред ел яет с я с л ед ующ им образ ом :
ИмяТипаСсылкиНаКласс = class of ИмяКласса
гд е И м я Типа С с ы л киН а Кл а с с — им я нов огот ипа, И м я Кл а с с а — им я л ю-
богокл ас с а.
Пос л е этого перем енны е, яв л яющ иес я с с ы л кам и на указ анны й
кл ас с , объяв л яют с я обы чны м образ ом :
ИмяСсылкиНаКласс: ИмяТипаСсылкиНаКласс
(ис пол ь з ов ат ь в ы ражение class of И м я Кл а с с а прям ов объяв л ении пере-
м енной нел ь з я).
С точки з рения в нут реннегопред с т ав л ения с с ы л ка на кл ас с пред -
с т ав л яет с обой указ ат ел ь на т абл иц у в ирт уал ь ны х м етод ов д анного
кл ас с а. О д наков ы з в ат ь с ее пом ощ ь ю обы чны й в ирт уал ь ны й м етод не-
в оз м ожно, пос кол ь ку ем у необход им о перед ат ь ад рес конкрет ного объ-
ект а. Кл ас с ов ы е с с ы л ки прим еняют с я л ишь д л я в ы з ов а конс т рукторов и
с пец иал ь ны х кл а ссовых ме тодов (class methods), которы м объект кл ас с а
не нужен. С инт акс ис в ы з ов а т акой же, как и при ис пол ь з ов ании обы ч-
ны х объект ны х с с ы л ок:
ИмяСсылкиНаКласс.ИмяКонструктораИлиКлассовогоМетода(Параметры)
Х отя кл ас с ов ы е с с ы л ки и яв л яют с я указ ат ел ям и, с т рукт уры д ан-
ны х, которы е они ад рес уют, никогд а не м еняют с я и ис пол ь з уют с я тол ь ко
48
Страницы
- « первая
- ‹ предыдущая
- …
- 46
- 47
- 48
- 49
- 50
- …
- следующая ›
- последняя »
