Введение в OTCL

Авторы не несут никакой ответственности за возможные проблемы, которые могут возникнуть при использовании советов и рекомендаций данного документа.

Данное введение предназначено для ознакомления читателя с синтаксисом OTCL (Object oriented TCL). Предполагается, что читатель знаком с основами объектно-ориентированного программирования (Java, C++). Перед прочтением данного документа, мы рекомендуем преварительно ознакомится с "Введением в TCL".

1. Сравнение с C++

Тем, кто достаточно свободно ориентируется в C++, синтаксис OTCL и программирование в OTCL не покажется достаточно сложным. Принимая во внимание тот факт, что C++ является на сегодняшний день наиболее распространенным объектно ориентированным языком программирования, вначале коротко перечислим основные различия между OTCL и C++:

2. Программирование в OTCL

Создадим класс 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 принимает в качестве параметров имена двух методов и значения параметров.


Автор: Дмитрий Молчанов

last updated Sun, August 29, 2004 19:37 by Yevgeni Koucheryavy