Авторы не несут никакой ответственности за возможные проблемы, которые могут возникнуть при использовании советов и рекомендаций данного документа.
Данное введение предназначено для ознакомления читателя с синтаксисом OTCL (Object oriented TCL). Предполагается, что читатель знаком с основами объектно-ориентированного программирования (Java, C++). Перед прочтением данного документа, мы рекомендуем преварительно ознакомится с "Введением в TCL".
Тем, кто достаточно свободно ориентируется в C++, синтаксис OTCL и программирование в OTCL не покажется достаточно сложным. Принимая во внимание тот факт, что C++ является на сегодняшний день наиболее распространенным объектно ориентированным языком программирования, вначале коротко перечислим основные различия между OTCL и C++:
instproc)
добавляет метод к классу. Каждое определение переменной (при помощи set
или через instvar в теле метода) добавляет переменную к объекту!
instproc
init в OTCL. Вместо деструктора в C++, определяем destroy instproc
в OTCL. В отличие от конструкторов и деструкторов, методы init
и destroy, не объединяются с базовыми классами автоматически.
Они должны быть объединены явно с использованием next.
self
в OTCL эквивалентно this в C++, может использоваться внутри метода.
В отличие от C++, методы OTcl всегда виртуальны.
$class.
proc методы
на объекте класса. Создадим класс myClass.
% Class myClass myClass
Мы можем теперь создавать реализации класса myClass.
Используя info можно получить информацию о классе и его реализациях.
% myClass instance1 abagel % instance1 info class myClass % myClass info instances instance1
Очевидно, что наш класс не делает ровным счетом ничего - он просто
существует. Однако мы можем при помощи метода set создать переменную
экземпляра. Необходимо отметить, что все переменные являются public (если рассматривать
C++). Метод info позволяет получить всю необходимую информацию.
Так мы можем получить информацию об объявленных переменных, а также их значениях.
% instance1 set myVar 0 0 % instance1 info vars myVar % instance set myVar 0
Часто мы хотим предварительно инициализировать переменные, непосредственно
перед их использованием. Так в C++ мы используем конструкторы. В OTCL необходимо
использовать init instproc для класса myClass. Вообще каждый раз
когда необходимо инициализировать объекты, следует определять init
instproc для рассматриваемого класса. Рассмотрим пример:
% myClass instproc init {args} {
$self set myVar 0;
eval $self next $args
}
% myClass instance2
instance2
% instance2 info vars
myVar
% instance2 set myVar
0
Очевидно, что переменная self имеет значение аналогичное
this в C++.
Уничтожим экземляр класса и создадим снова:
% myClass info instances instance1 instance2 % instance destroy % myClass info instances instance2 % myClass instance1 instance1
Методы, определенные на классах для использования в последующимих
экземплярами называются instprocs. Они имеют список параметров и код подобно
обычной процедуре TCL (proc). Создадим новый метод.
% Bagel instproc myMethod {} {
$self instvar myVar;
incr myVar;
if {$myVar > 1} then {
put "Oops, i did it again :)";
}
returnl {}
}
% myClass info instprocs
init myMethod
Помимо элементарного манипулирования с переменной myVar
(инкремент, анализ) код демонстрирует метод instvar. Он используется
для объявления экземпляра переменной и определить их в локальной области метода.
Переменной экземляра myVar, определенная ранее командой set
теперь можно манипулировать в пределах метода myMethod при помощи
локальной переменной myVar.
Теперь можно вызывать метод myMethod аналогично instproc
info и destroy. Необходимо отметить, что методы info
destroy определены OTCL и существуют для каждого класса. Таким
образом нет никаких отличий пользовательских методов от методов, определенных
системой.
% instance1 myMethod % instance1 myMethod Oops, i did it again :)
Рассмотрим процедуру наслодования в OTCL. Для этого определим новый класс inheritedClass, который наследует myClass.
% Class inheritedClass -superclass myClass inheritedClass % inheritedClass info superclass myClass % inheritedClass info heritage myClass Object
В примере продемонстрированы дополгительные возможности метода
info. В самом деле переметер superclass позволяет
уточнить, что класс inheritedClass действительно уначледован от
myClass, тогда как класс myClass, в свою очередь наследуется
от Object. Класс Object включает все основные характеристики
класса от которого наследуются по умолчанию новые классы (Class newClass
эквивалентнго Class newClass -superclass Object).
Синтаксис создания нового класса, с использованием "-superclass", требует дополнительного пояснения. Необходимо отметить, что следующие объявления являются эквивалентными для OTCL - все они создают класс inheritedClass наследуемый от myClass.
% Class inheritedClass inheritedClass % SpreadableBagel superclass myClass
% Class creat inheritedClass inheritedClass % inheritedClass superclass myClass
% Class inheritedClass -superclass myClass inheritedClass
Добавим еще один параметр:
% myClass instproc nextVar {n} {
$self set myVar1 $n
}
% inheritedClass instance1 -nextVar 150
instance1
% instance1 set myVar1
150
Добавим инициализацию к классу inheritedClass.
% inheritedClass instproc init {args} {
$self set array {};
eval $self next $args
}
% instance1 instproc settings {args} {
$self instvar array;
set array [concat $array $args]
return $array
}
Тперь необходимо обратиться к объяснению значения next
в методе init. next используется для вызова инициализации
для класса myClass (от которого наследуется inheritedClass). init
instproc инициализируется переменную myVar. В свою очередь next
класса myClass вызывает инициализационный метод init
класса Object. init класса Object принимает
в качестве параметров имена двух методов и значения параметров.