[1] OTcl
OTcl称为Object Tcl,它是在Tcl的基础上做了一个面向对象的封装,是一种面向对象的脚本语言。
注意:
(1)OTcl的编程风格与C++有很大不同;
[2] 类定义
如何定义一个类?
例如:
% Class Fruits ;#定义一个类
Fruits
% Fruits apple ;#创建一个对象实例
apple
% apple info class ;#查看实例属于哪一个类
Fruits
% Fruits info instances ;#查看类拥有的实例
apple
[3] 构造函数与析构函数
OTcl同样提供构造函数和析构函数,使类对象能够轻巧地被创建和撤销。(作用同C++)
注意:
(1)OTcl中,构造函数名和析构函数名不需要同类名相同;
(2)一般,通过调用init过程来实现类的构造函数,调用destroy过程完成类的析构;
(3)OTcl中,构造函数和析构函数不会自动调用父类的构造函数和析构函数,必须通过$self next命令显式调用父类的构造函数和析构函数;
例如:
Safety instproc init{} { ;#构造函数(Safety为类名)
$self next
$self set count 0
}
Safety instproc destroy{} { ;#析构函数
$self next
}
[4] 成员变量和成员函数
注意:
(1)OTcl中,成员变量并不需要事先定义,在成员函数需要使用它的时候,再在函数体内定义;
(2)定义成员变量使用关键字instvar;
(3)在所有的成员函数中要使用已经声明了的成员变量必须使用instvar来重新声明,否则变量只是当做函数内局部变量;
(4)成员函数所有的成员变量都是基于public的;
(5)定义成员函数使用关键字instproc;
(6)定义成员函数与定义一个普通的过程相同,只是在前面指定类名即可;(表明它是哪个类的成员函数)
(7)所有的成员函数也都是public的;
例如:
#定义类Fruits的一个init成员函数;
#变量$self表示对象本身(像C++中的this指针);
#next是指父类的同名方法(像C++中的覆盖);
% Fruits instproc init{args} {
$self set instvar color 0 ;#初始化成员变量为0
eval $self next $args
}
#
% Fruits instproc show_color{} {
set color green
puts "the color of fruit is $color"
}
% Fruits apple
% apple set color ;#查看成员变量color的值
0
% apple show_color ;#调用Fruits的show_color方法
the color of fruit is green
% apple set color
0 ;#仍然是0,因为在show_color中定义的color只是局部变量(没有使用关键字instvar)
[5] 继承
在OTcl中,使用关键字superclass表示类的继承。
注意:
(1)在OTcl中所有成员变量和成员函数都是基于public属性的(这一点不同于C++),从而减小了编程难度;
(2)子类的对象可以继承和使用基类的所有成员函数和方法;
例如:
% Class Fruits ;#定义父类Fruits
Fruits instproc grow{} { ;#定义Fruits的成员函数grow
$self instvar weight
incr weight
if{$weight>10} then{
puts stderr "it is mature!"
}
return {} ;#注意return的用法与C中的区别
}
% Fruits instproc show_color{} { ;#定义Fruits的成员函数show_color
set color green
puts "the color of fruit is $color"
}
% Class Apple -superclass Fruits ;#类Apple继承自Fruits
% Apple apple
Apple instproc init{args} {
eval $self next $args ;#调用父类Fruits的构造函数
}
% apple show_color ;#实际调用的是父类Fruits的show_color函数
the color of fruit is green
[6] 多继承
P.34
例如:
Class 子类 -superclass {父类1 父类2} ;#多继承
注意:
(1)可以用info命令查看类的继承关系;
例如:
% 子类 info heritage ;#查看子类的继承关系
父类1 父类2 Object ;#按顺序输出子类继承的父类
[7] 重写
子类可以重写父类的成员函数,在成员函数中使用next命令来覆盖父类中同名的成员函数。
[8] 常用关键字
名称 描述 类型
-------------------------------------------------
self 对象本身 变量
proc 方法名 变量
class 定义类 变量
next 调用父类的同名方法 方法