17.7. Шаблоны 385
своены параметрам шаблона. Их указывают в угловых скобках после
стереотипа «bind». При создании экземпляра шаблона его параметры
будут заменены этими значениями, в результате получится новый
класс. Обратите внимание на синтаксис связывания параметров: вы
ражение type>int означает, что параметр шаблона type при создании
экземпляра замещается int. Символ > можно прочитать как «замеща
ется» или «связывается».
Очевидно, что шаблоны являются мощным механизмом многократно
го использования кода. Класс можно описать как шаблон, в общих
чертах, и затем создавать множество его специальных версий, присва
ивая параметрам шаблона соответствующие реальные значения.
На рис. 17.10 связывание на самом деле используется двумя способами.
Вопервых, классификатор связывается с параметром type. Если у пара
метра шаблона нет типа, то по умолчанию это классификатор. Вовто
рых, параметру size присваивается реальное целое значение. Это позво
ляет задавать размер ограниченного массива как параметр шаблона.
В рамках конкретного шаблона имена параметров являются локаль
ными. Это означает, что если у двух шаблонов есть параметр type, в каж
дом случае это разные параметры type.
Существует разновидность синтаксиса шаблонов, которую называют
неявным связыванием. Здесь для представления создания экземпляра
шаблона не используется явная реализация «bind», но происходит не
явное связывание за счет применения специального синтаксиса в по
лучаемых классах. Чтобы неявно создать экземпляр шаблона, факти
ческие значения перечисляют в угловых скобках после имени класса
шаблона, как показано на рис. 17.11. Недостаток этого подхода в том,
что получаемому в результате классу нельзя присвоить имя.
По нашему мнению, лучше использовать явное связывание, чтобы
классы, получаемые в результате создания экземпляров шаблона,
могли иметь собственные описательные имена.
Хотя шаблоны – очень мощная возможность, в настоящее время C++
и Java являются единственными распространенными ОО языками про
граммирования, которые их поддерживают (табл. 17.1). Понятно, что
шаблоны могут использоваться при проектировании только в том слу
чае, если они поддерживаются языком реализации.
BoundedArray
elements[size] : type
addElement( e:type ) : void
getElement( i:int ) : type
BoundedArray< type!>String >
elements[10] : String
addElement( e:String ) : void
getElement( i:int ) : String
неявное связывание
type, size : int = 10
Рис. 17.11. Создание экземпляра шаблона посредством неявного связывания