9. Шаблон

Использование ссылок в качестве имён значений в объектах позволяет создавать объекты-шаблоны. Вот примерно как это выглядит:

Специальный класс, запрашивающий значение по имени у вызывающего объекта. Для примера пусть для этого служит функция get(name).

{
    [тип]=>Класс;
    [имя]=>”Запрос параметра”;
    [свойства]=>{
            [1]=>Свойство имя;
            [2]=>Свойство тип;
            [3]=>Свойство имя параметра;
    }
    [интерфейсы]=>{ get(name); }
}

Объект Запрос1 класса Запрос параметра

{
    [тип]=>Запрос параметра;
    [имя]=>”Запрос1”;
    [имя параметра]=>”значение параметра”;
}

Класс, выводящий строку на печать и последовательно передающий управление дочерним объектам. Для примера пусть это будет функция print(), а функция get(name) будет возвращать значение свойства по имени.

{
    [тип]=>Класс;
    [имя]=>”Класс1”;
    [свойства]=>{
            [1]=>Свойство имя;
            [2]=>Свойство тип;
            [3]=>Свойство строка для печати;
            [4]=>Свойство дочерние объекты;
    }
    [интерфейсы]=>{
            { print(); }
            { get(name); }
    }
}

Объект Объект1 класса Класс1. Обратите внимание, что он имеет свойство “значение параметра”, которого нет в его типе.

{
    [тип]=>Класс1;
    [имя]=>”Объект1”;
    [строка для печати]=>”Объект1”;
    [значение параметра]=>”Дочерний объект Объекта1”;
    [дочерние объекты]=>{
            [1]=>Шаблон1;
            [2]=>Шаблон2;
    }
}

Объект Шаблон1, используемый как дочерний объект Объекта1. Обратите внимание, что значением свойства “строка для печати” выступает ссылка на объект Запрос1.

{
    [тип]=>Класс1;
    [имя]=>”Шаблон1”;
    [строка для печати]=>Запрос1;
}

Объект Шаблон2, аналогичный объекту Шаблон1.

{
    [тип]=>Класс1;
    [имя]=>”Шаблон2”;
    [строка для печати]=>Параметр1;
}

Цепочка вызовов в данном примере будет выглядеть так:

...

На печать при этом будет выведено:

Объект1
Дочерний объект Объекта1
Дочерний объект Объекта1

Использование ссылки в качестве имени значения позволяет менять имя свойства “значение параметра”, что позволяет разрешать возможные конфликты имен при использовании шаблонов.

ПРИМЕЧАНИЕ

В C++ есть шаблоны классов, но нет шаблонов шаблонов. Концепция классов и ссылок WYCIWYC позволяет создавать такие шаблоны.

По сути любой класс – это шаблон объекта, свойства которого не заполнены значениями, но WYCIWYC даёт возможность и экземпляры объектов с частично заполненными свойствами делать шаблонами, или строить из объектов структуры, которые пользователь сможет использовать как шаблоны документов.

Автор: Андрей Шаройко <vanyamboe@gmail.com>